1  /-
  2  Copyright (c) 2017 Mario Carneiro. All rights reserved.
  3  Released under Apache 2.0 license as described in the file LICENSE.
  4  Authors: Mario Carneiro
  5  -/
  6  import data.nat.modeq data.zsqrtd.basic tactic.ring
src         └────────────┘ └───────────────┘ └─────────┘
  7  
  8  namespace pell
  9  open nat
 10  
 11  section
 12    parameters {a : ℕ} (a1 : a > 1)
id                               
src                              
typ                              
 13  
 14    include a1
 15    private def d := a*a - 1
id                       
src                        
typ                      
 16  
 17    @[simp] theorem d_pos : 0 < d := nat.sub_pos_of_lt (mul_lt_mul a1 (le_of_lt a1) dec_trivial dec_trivial : 1*1<a*a)
id                                    └───────────────┘  └────────┘ └┘  └──────┘ └┘  └─────────┘ └─────────┘     
src                                   └───────────────┘  └────────┘     └──────┘     └─────────┘ └─────────┘      
typ                                   └───────────────┘  └────────┘ └┘  └──────┘ └┘  └─────────┘ └─────────┘     
doc      └──┘                                                                          └─────────┘ └─────────┘
 18  
 19    /-- The Pell sequences, defined together in mutual recursion. -/
 20    -- TODO(lint): Fix double namespace issue
 21    @[nolint] def pell : ℕ → ℕ × ℕ :=
id                               
src                              
typ                              
doc      └────┘
 22    λn, nat.rec_on n (1, 0) (λn xy, (xy.1*a + d*xy.2, xy.1 + xy.2*a))
id        └────────┘           └┘  └┘   └┘   └┘   └┘ 
src        └────────┘                                    
typ       └────────┘           └┘  └┘   └┘   └┘   └┘ 
 23  
 24    /-- The Pell `x` sequence. -/
 25    def xn (n : ℕ) : ℕ := (pell n).1
id                          └──┘  
src                         └──┘   
typ                         └──┘  
doc                           └──┘
 26    /-- The Pell `y` sequence. -/
 27    def yn (n : ℕ) : ℕ := (pell n).2
id                          └──┘  
src                         └──┘   
typ                         └──┘  
doc                           └──┘
 28  
 29    @[simp] theorem pell_val (n : ℕ) : pell n = (xn n, yn n) :=
id                                       └──┘   └┘   └┘ 
src                                      └──┘    └┘    └┘
typ                                      └──┘   └┘   └┘ 
doc      └──┘                             └──┘      └┘    └┘
 30    show pell n = ((pell n).1, (pell n).2), from match pell n with (a, b) := rfl end
id          └──┘    └──┘      └──┘                 └──┘                └─┘
src         └──┘     └──┘       └──┘                  └──┘                 └─┘
typ         └──┘    └──┘      └──┘                 └──┘                └─┘
doc         └──┘       └──┘        └──┘                   └──┘
 31  
 32    @[simp] theorem xn_zero : xn 0 = 1 := rfl
id                               └┘         └─┘
src                              └┘         └─┘
typ                              └┘         └─┘
doc      └──┘                    └┘
 33    @[simp] theorem yn_zero : yn 0 = 0 := rfl
id                               └┘         └─┘
src                              └┘         └─┘
typ                              └┘         └─┘
doc      └──┘                    └┘
 34  
 35    @[simp] theorem xn_succ (n : ℕ) : xn (n+1) = xn n * a + d * yn n := rfl
id                                      └┘      └┘       └┘     └─┘
src                                     └┘       └┘         └┘      └─┘
typ                                     └┘      └┘       └┘     └─┘
doc      └──┘                            └┘         └┘             └┘
 36    @[simp] theorem yn_succ (n : ℕ) : yn (n+1) = xn n + yn n * a := rfl
id                                      └┘      └┘   └┘       └─┘
src                                     └┘       └┘    └┘         └─┘
typ                                     └┘      └┘   └┘       └─┘
doc      └──┘                            └┘         └┘     └┘
 37  
 38    @[simp] theorem xn_one : xn 1 = a := by simp
id                              └┘    
src                             └┘            └────
typ                             └┘           └────
doc      └──┘                   └┘             └────
txt                                            └────
par                                            └────
pid                                                
st                                            └─────
 39    @[simp] theorem yn_one : yn 1 = 1 := by simp
id                              └┘   
src  ─┘                         └┘            └────
typ  ─┘                         └┘            └────
doc  ─┘  └──┘                   └┘             └────
txt  ─┘                                        └────
par  ─┘                                        └────
pid  ─┘                                            
st   ─┘                                       └─────
 40  
src  
typ  
doc  
txt  
par  
pid  
st   
 41    def xz (n : ℕ) : ℤ := xn n
id                         └┘ 
src  ─┘                    └┘
typ  ─┘                    └┘ 
doc  ─┘                      └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 42    def yz (n : ℕ) : ℤ := yn n
id                         └┘ 
src                        └┘
typ                        └┘ 
doc                          └┘
 43    def az : ℤ := a
id                  
src             
typ                 
 44  
 45    theorem asq_pos : 0 < a*a :=
id                          
src                          
typ                         
 46    le_trans (le_of_lt a1) (by have := @nat.mul_le_mul_left 1 a a (le_of_lt a1); rwa mul_one at this)
id     └──────┘  └──────┘ └┘               └─────────────────┘       └──────┘ └┘       └─────┘
src    └──────┘  └──────┘         └──────┘ └─────────────────┘└─┘   └──────┘    └──┘└─────┘└──────┘
typ    └──────┘  └──────┘ └┘      └──────┘ └─────────────────┘└─┘  └──────┘└┘  └──┘└─────┘└──────┘
doc                               └──────┘                    └─┘               └──┘       └──────┘
txt                               └──────┘                    └─┘               └──┘       └──────┘
par                               └──────┘                    └─┘               └──┘       └──────┘
pid                               └───┘└─┘                    └─┘                         └──────┘
st                               └─────────────────────────────────────────────────────┘└─────┘└──────┘
 47  
 48    theorem dz_val : ↑d = az*az - 1 :=
id                        └┘└┘ 
src                       └┘└┘ 
typ                       └┘└┘ 
 49    have 1 ≤ a*a, from asq_pos,
id                    └─────┘
src                     └─────┘
typ                   └─────┘
 50    show ↑(a*a - 1) = _, by rw int.coe_nat_sub this; refl
id                          └─────────────┘ └──┘
src                        └─┘└─────────────┘      └────
typ                      └─┘└─────────────┘└──┘  └────
doc                            └─┘                     └────
txt                            └─┘                     └────
par                            └─┘                     └────
pid                                                       
st                            └──────────────────────────────
 51  
src  
typ  
doc  
txt  
par  
pid  
st   
 52    @[simp] theorem xz_succ (n : ℕ) : xz (n+1) = xz n * az + ↑d * yz n := rfl
id                                      └┘      └┘   └┘    └┘     └─┘
src  ─┘                                 └┘       └┘    └┘    └┘      └─┘
typ  ─┘                                 └┘      └┘   └┘    └┘     └─┘
doc  ─┘  └──┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 53    @[simp] theorem yz_succ (n : ℕ) : yz (n+1) = xz n + yz n * az := rfl
id                                      └┘      └┘   └┘   └┘    └─┘
src                                     └┘       └┘    └┘    └┘    └─┘
typ                                     └┘      └┘   └┘   └┘    └─┘
doc      └──┘
 54  
 55    /-- The Pell sequence can also be viewed as an element of `ℤ√d` -/
 56    def pell_zd (n : ℕ) : ℤ√d := ⟨xn n, yn n⟩
id                          └┘     └┘   └┘ 
src                         └┘     └┘    └┘
typ                         └┘     └┘   └┘ 
doc                          └┘      └┘    └┘
 57    @[simp] theorem pell_zd_re (n : ℕ) : (pell_zd n).re = xn n := rfl
id                                          └─────┘  └┘   └┘     └─┘
src                                         └─────┘   └┘   └┘      └─┘
typ                                         └─────┘  └┘   └┘     └─┘
doc      └──┘                                └─────┘         └┘
 58    @[simp] theorem pell_zd_im (n : ℕ) : (pell_zd n).im = yn n := rfl
id                                          └─────┘  └┘   └┘     └─┘
src                                         └─────┘   └┘   └┘      └─┘
typ                                         └─────┘  └┘   └┘     └─┘
doc      └──┘                                └─────┘         └┘
 59  
 60    /-- The property of being a solution to the Pell equation, expressed
 61      as a property of elements of `ℤ√d`. -/
 62    def is_pell : ℤ√d → Prop | ⟨x, y⟩ := x*x - d*y*y = 1
id                   └┘                        
src                  └┘                           
typ                  └┘                        
doc                  └┘
 63  
 64    theorem is_pell_nat {x y : ℕ} : is_pell ⟨x, y⟩ ↔ x*x - d*y*y = 1 :=
id                                    └─────┘          
src                                   └─────┘                
typ                                   └─────┘          
doc                                    └─────┘
 65    ⟨λh, int.coe_nat_inj (by rw int.coe_nat_sub (int.le_of_coe_nat_le_coe_nat $ int.le.intro_sub h); exact h),
id         └─────────────┘        └─────────────┘  └──────────────────────────┘   └──────────────┘          
src         └─────────────┘     └─┘└─────────────┘ └──────────────────────────┘ └──────────────┘   └────┘
typ        └─────────────┘     └─┘└─────────────┘ └──────────────────────────┘ └──────────────┘  └────┘
doc                             └─┘                                                                └────┘
txt                             └─┘                                                                └────┘
par                             └─┘                                                                └────┘
pid                                                                                                    
st                             └──────────────────────────────────────────────────────────────────────────────┘
 66    λh, show ((x*x : ℕ) - (d*y*y:ℕ) : ℤ) = 1, by rw [← int.coe_nat_sub $ le_of_lt $ nat.lt_of_sub_eq_succ h, h]; refl⟩
id                                          └─────────────┘   └──────┘   └───────────────────┘   
src                                        └────┘└─────────────┘ └──────┘ └───────────────────┘ └┘   └──┘
typ                                   └────┘└─────────────┘ └──────┘ └───────────────────┘└┘  └──┘
doc                                                 └────┘                                               └┘   └──┘
txt                                                 └────┘                                               └┘   └──┘
par                                                 └────┘                                               └┘   └──┘
pid                                                   └──┘                                               └┘ 
st                                                 └─────────────────────────────────────────────────────────┘└─┘└────┘
 67  
 68    theorem is_pell_norm : Π {b : ℤ√d}, is_pell b ↔ b * b.conj = 1
id                                  └┘   └─────┘     └───┘ 
src                                  └┘   └─────┘        └───┘ 
typ                                 └┘   └─────┘     └───┘ 
doc                                  └┘    └─────┘          └───┘
 69    | ⟨x, y⟩ := by simp [zsqrtd.ext, is_pell, mul_comm]
id                          └────────┘  └─────┘  └──────┘
src                   └────┘└────────┘└┘└─────┘└┘└──────┘└─
typ                   └────┘└────────┘└┘└─────┘└┘└──────┘└─
doc                   └────┘          └┘└─────┘└┘        └─
txt                   └────┘          └┘       └┘        └─
par                   └────┘          └┘       └┘        └─
pid                                 └┘       └┘        
st                   └─────────────────────────────────────
 70  
src  
typ  
doc  
txt  
par  
pid  
st   
 71    theorem is_pell_mul {b c : ℤ√d} (hb : is_pell b) (hc : is_pell c) : is_pell (b * c) :=
id                                └┘        └─────┘         └─────┘     └─────┘    
src  ─┘                           └┘        └─────┘          └─────┘      └─────┘    
typ  ─┘                           └┘        └─────┘         └─────┘     └─────┘    
doc  ─┘                           └┘         └─────┘          └─────┘      └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 72    is_pell_norm.2 (by simp [mul_comm, mul_left_comm,
id     └──────────┘            └──────┘  └───────────┘
src    └──────────┘      └────┘└──────┘└┘└───────────┘└─
typ    └──────────┘      └────┘└──────┘└┘└───────────┘└─
doc                       └────┘        └┘             └─
txt                       └────┘        └┘             └─
par                       └────┘        └┘             └─
pid                                   └┘             └─
st                       └───────────────────────────────
 73      zsqrtd.conj_mul, pell.is_pell_norm.1 hb, pell.is_pell_norm.1 hc])
id       └─────────────┘                      └┘                      └┘
src  ───┘└─────────────┘└┘                 └─┘  └┘                 └─┘  
typ  ───┘└─────────────┘└┘                 └─┘└┘└┘                 └─┘└┘
doc  ───┘               └┘                 └─┘  └┘                 └─┘  
txt  ───┘               └┘                 └─┘  └┘                 └─┘  
par  ───┘               └┘                 └─┘  └┘                 └─┘  
pid  ───┘               └┘                 └─┘  └┘                 └─┘  
st   ───────────────────────────────────────────────────────────────────┘
 74  
 75    theorem is_pell_conj : ∀ {b : ℤ√d}, is_pell b ↔ is_pell b.conj | ⟨x, y⟩ :=
id                                  └┘   └─────┘   └─────┘ └───┘
src                                  └┘   └─────┘    └─────┘  └───┘
typ                                 └┘   └─────┘   └─────┘ └───┘
doc                                  └┘    └─────┘     └─────┘  └───┘
 76    by simp [is_pell, zsqrtd.conj]
id              └─────┘  └─────────┘
src       └────┘└─────┘└┘└─────────┘└─
typ       └────┘└─────┘└┘└─────────┘└─
doc       └────┘└─────┘└┘└─────────┘└─
txt       └────┘       └┘           └─
par       └────┘       └┘           └─
pid                  └┘           
st       └────────────────────────────
 77  
src  
typ  
doc  
txt  
par  
pid  
st   
 78    @[simp] theorem pell_zd_succ (n : ℕ) : pell_zd (n+1) = pell_zd n * ⟨a, 1⟩ :=
id                                           └─────┘      └─────┘    
src  ─┘                                      └─────┘       └─────┘   
typ  ─┘                                      └─────┘      └─────┘    
doc  ─┘  └──┘                                 └─────┘         └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 79    by simp [zsqrtd.ext]
id              └────────┘
src       └────┘└────────┘└─
typ       └────┘└────────┘└─
doc       └────┘          └─
txt       └────┘          └─
par       └────┘          └─
pid                     
st       └──────────────────
 80  
src  
typ  
doc  
txt  
par  
pid  
st   
 81    theorem is_pell_one : is_pell ⟨a, 1⟩ :=
id                           └─────┘  
src  ─┘                      └─────┘
typ  ─┘                      └─────┘  
doc  ─┘                      └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 82    show az*az-d*1*1=1, by simp [dz_val]
id          └┘└┘              └────┘
src         └┘└┘        └────┘└────┘└─
typ         └┘└┘        └────┘└────┘└─
doc                           └────┘      └─
txt                           └────┘      └─
par                           └────┘      └─
pid                                     
st                           └──────────────
 83  
src  
typ  
doc  
txt  
par  
pid  
st   
 84    theorem is_pell_pell_zd : ∀ (n : ℕ), is_pell (pell_zd n)
id                                        └─────┘  └─────┘ 
src  ─┘                                    └─────┘  └─────┘
typ  ─┘                                   └─────┘  └─────┘ 
doc  ─┘                                     └─────┘  └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 85    | 0     := rfl
id                └─┘
src               └─┘
typ               └─┘
 86    | (n+1) := let o := is_pell_one in by simp; exact pell.is_pell_mul (is_pell_pell_zd n) o
id                       └─────────┘                                     └─────────────┘   
src                       └─────────┘       └──┘  └────┘                                 └┘ 
typ                      └─────────┘       └──┘  └────┘                 └─────────────┘└┘
doc                                          └──┘  └────┘                                 └┘ 
txt                                          └──┘  └────┘                                 └┘ 
par                                          └──┘  └────┘                                 └┘ 
pid                                                                                      └┘ 
st                                          └───────────────────────────────────────────────────
 87  
src  
typ  
doc  
txt  
par  
pid  
st   
 88    @[simp] theorem pell_eqz (n : ℕ) : xz n * xz n - d * yz n * yz n = 1 := is_pell_pell_zd n
id                                       └┘   └┘     └┘   └┘        └─────────────┘ 
src  ─┘                                  └┘    └┘      └┘    └┘         └─────────────┘
typ  ─┘                                  └┘   └┘     └┘   └┘        └─────────────┘ 
doc  ─┘  └──┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
 89  
 90    @[simp] theorem pell_eq (n : ℕ) : xn n * xn n - d * yn n * yn n = 1 :=
id                                      └┘   └┘     └┘   └┘  
src                                     └┘    └┘      └┘    └┘   
typ                                     └┘   └┘     └┘   └┘  
doc      └──┘                            └┘     └┘         └┘     └┘
 91    let pn := pell_eqz n in
id         └┘    └──────┘ 
src              └──────┘
typ        └┘    └──────┘ 
 92    have h : (↑(xn n * xn n) : ℤ) - ↑(d * yn n * yn n) = 1,
id                └┘   └┘           └┘   └┘   
src               └┘    └┘            └┘    └┘    
typ               └┘   └┘           └┘   └┘   
doc                └┘     └┘                 └┘     └┘
 93      by repeat {rw int.coe_nat_mul}; exact pn,
id                     └─────────────┘         └┘
src         └──────┘└─┘└─────────────┘  └────┘
typ         └──────┘└─┘└─────────────┘  └────┘└┘
doc         └──────┘└─┘                 └────┘
txt         └──────┘└─┘                 └────┘
par         └──────┘└─┘                 └────┘
pid               └───┘                      
st         └─────────────────────────┘└┘└───────┘
 94    have hl : d * yn n * yn n ≤ xn n * xn n, from
id                 └┘   └┘   └┘   └┘ 
src                └┘    └┘    └┘    └┘
typ                └┘   └┘   └┘   └┘ 
doc                  └┘     └┘     └┘     └┘
 95      int.le_of_coe_nat_le_coe_nat $ int.le.intro $ add_eq_of_eq_sub' $ eq.symm h,
id       └──────────────────────────┘   └──────────┘   └───────────────┘   └─────┘ 
src      └──────────────────────────┘   └──────────┘   └───────────────┘   └─────┘
typ      └──────────────────────────┘   └──────────┘   └───────────────┘   └─────┘ 
 96    int.coe_nat_inj (by rw int.coe_nat_sub hl; exact h)
id     └─────────────┘        └─────────────┘ └┘        
src    └─────────────┘     └─┘└─────────────┘    └────┘
typ    └─────────────┘     └─┘└─────────────┘└┘  └────┘
doc                        └─┘                   └────┘
txt                        └─┘                   └────┘
par                        └─┘                   └────┘
pid                                                  
st                        └─────────────────────────────┘
 97  
 98    instance dnsq : zsqrtd.nonsquare d := ⟨λn h,
id                     └──────────────┘        
src                    └──────────────┘ 
typ                    └──────────────┘        
doc                    └──────────────┘
 99      have n*n + 1 = a*a, by rw ← h; exact nat.succ_pred_eq_of_pos (asq_pos a1),
id                                   └─────────────────────┘  └─────┘ └┘
src                         └───┘   └────┘└─────────────────────┘ └─────┘  
typ                     └───┘  └────┘└─────────────────────┘ └─────┘└┘
doc                             └───┘   └────┘                                 
txt                             └───┘   └────┘                                 
par                             └───┘   └────┘                                 
pid                               └─┘                                         
st                             └─────────────────────────────────────────────────┘
100      have na : n < a, from nat.mul_self_lt_mul_self_iff.2 (by rw ← this; exact nat.lt_succ_self _),
id                          └──────────────────────────┘           └──┘        └──────────────┘
src                           └──────────────────────────┘      └───┘      └────┘└──────────────┘└┘
typ                         └──────────────────────────┘      └───┘└──┘  └────┘└──────────────┘└┘
doc                                                               └───┘      └────┘                └┘
txt                                                               └───┘      └────┘                └┘
par                                                               └───┘      └────┘                └┘
pid                                                                 └─┘                           └┘
st                                                               └──────────────────────────────────┘
101      have (n+1)*(n+1) ≤ n*n + 1, by rw this; exact nat.mul_self_le_mul_self na,
id                               └──┘        └──────────────────────┘ └┘
src                               └─┘      └────┘└──────────────────────┘
typ                           └─┘└──┘  └────┘└──────────────────────┘└┘
doc                                     └─┘      └────┘                        
txt                                     └─┘      └────┘                        
par                                     └─┘      └────┘                        
pid                                                                          
st                                     └─────────────────────────────────────────┘
102      have n+n ≤ 0, from @nat.le_of_add_le_add_right (n*n + 1) _ _ (by simpa [mul_add, mul_comm, mul_left_comm]),
id                       └────────────────────────┘                      └─────┘  └──────┘  └───────────┘
src                        └────────────────────────┘                 └─────┘└─────┘└┘└──────┘└┘└───────────┘
typ                      └────────────────────────┘               └─────┘└─────┘└┘└──────┘└┘└───────────┘
doc                                                                       └─────┘       └┘        └┘             
txt                                                                       └─────┘       └┘        └┘             
par                                                                       └─────┘       └┘        └┘             
pid                                                                                   └┘        └┘             
st                                                                       └───────────────────────────────────────┘
103      ne_of_gt d_pos $ by rw nat.eq_zero_of_le_zero (le_trans (nat.le_add_left _ _) this) at h; exact h⟩
id       └──────┘ └───┘         └────────────────────┘  └──────┘  └─────────────┘      └──┘              
src      └──────┘ └───┘      └─┘└────────────────────┘ └──────┘ └─────────────┘└────┘    └────┘  └────┘
typ      └──────┘ └───┘      └─┘└────────────────────┘ └──────┘ └─────────────┘└────┘└──┘└────┘  └────┘
doc                          └─┘                                               └────┘    └────┘  └────┘
txt                          └─┘                                               └────┘    └────┘  └────┘
par                          └─┘                                               └────┘    └────┘  └────┘
pid                                                                           └────┘    └───┘       
st                          └────────────────────────────────────────────────────────────────────────────┘
104  
105    theorem xn_ge_a_pow : ∀ (n : ℕ), a^n ≤ xn n
id                                      └┘ 
src                                        └┘
typ                                     └┘ 
doc                                           └┘
106    | 0     := le_refl 1
id                └─────┘
src               └─────┘
typ               └─────┘
107    | (n+1) := by simp [nat.pow_succ]; exact le_trans
id                        └──────────┘         └──────┘
src                 └────┘└──────────┘  └────┘└──────┘
typ                 └────┘└──────────┘  └────┘└──────┘
doc                  └────┘              └────┘        
txt                  └────┘              └────┘        
par                  └────┘              └────┘        
pid                                                 
st                  └────────────────────────────────────
108      (nat.mul_le_mul_right _ (xn_ge_a_pow n)) (nat.le_add_right _ _)
id        └──────────────────┘    └─────────┘     └──────────────┘
src  ───┘ └──────────────────┘└─┘             └─┘ └──────────────┘└─────
typ  ───┘ └──────────────────┘└─┘ └─────────┘└─┘ └──────────────┘└─────
doc  ───┘                     └─┘             └─┘                 └─────
txt  ───┘                     └─┘             └─┘                 └─────
par  ───┘                     └─┘             └─┘                 └─────
pid  ───┘                     └─┘             └─┘                 └───┘
st   ────────────────────────────────────────────────────────────────────
109  
src  
typ  
doc  
txt  
par  
pid  
st   
110    theorem n_lt_a_pow : ∀ (n : ℕ), n < a^n
id                                     
src  ─┘                                   
typ  ─┘                                
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
111    | 0     := nat.le_refl 1
id                └─────────┘
src               └─────────┘
typ               └─────────┘
112    | (n+1) := begin have IH := n_lt_a_pow n,
id                                └────────┘ 
src                    └─────────┘          
typ                    └─────────┘└────────┘
doc                     └─────────┘          
txt                     └─────────┘          
par                     └─────────┘          
pid                     └─────┘└─┘          
st                └───────────────────────────┘└─
113      have : a^n + a^n ≤ a^n * a,
id                           
src      └─────┘        
typ      └─────┘       
doc      └─────┘            
txt      └─────┘            
par      └─────┘            
pid      └───┘└┘            
st   ─────────────────────────────┘└─
114      { rw ← mul_two, exact nat.mul_le_mul_left _ a1 },
id              └─────┘        └─────────────────┘   └┘
src        └───┘└─────┘  └────┘└─────────────────┘└─┘  
typ        └───┘└─────┘  └────┘└─────────────────┘└─┘└┘
doc        └───┘         └────┘                   └─┘  
txt        └───┘         └────┘                   └─┘  
par        └───┘         └────┘                   └─┘  
pid          └─┘                                 └─┘  
st   ─────┘└──────────┘└───────────────────────────────┘└┘
115      simp [nat.pow_succ], refine lt_of_lt_of_le _ this,
id             └──────────┘          └────────────┘   └──┘
src      └────┘└──────────┘  └─────┘└────────────┘└─┘
typ      └────┘└──────────┘  └─────┘└────────────┘└─┘└──┘
doc      └────┘              └─────┘              └─┘
txt      └────┘              └─────┘              └─┘
par      └────┘              └─────┘              └─┘
pid                                            └─┘
st   ──────────────────────┘└────────────────────────────┘└─
116      exact add_lt_add_of_lt_of_le IH (lt_of_le_of_lt (nat.zero_le _) IH)
id             └────────────────────┘     └────────────┘  └─────────┘    └┘
src      └────┘└────────────────────┘   └────────────┘ └─────────┘└──┘  └─
typ      └────┘└────────────────────┘   └────────────┘ └─────────┘└──┘└┘└─
doc      └────┘                                                   └──┘  └─
txt      └────┘                                                   └──┘  └─
par      └────┘                                                   └──┘  └─
pid                                                              └──┘  
st   ────────────────────────────────────────────────────────────────────────
117    end
src  ─┘
typ  ─┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘└─┘
118  
119    theorem n_lt_xn (n) : n < xn n :=
id                             └┘ 
src                             └┘
typ                            └┘ 
doc                              └┘
120    lt_of_lt_of_le (n_lt_a_pow n) (xn_ge_a_pow n)
id     └────────────┘  └────────┘    └─────────┘ 
src    └────────────┘  └────────┘     └─────────┘
typ    └────────────┘  └────────┘    └─────────┘ 
121  
122    theorem x_pos (n) : xn n > 0 :=
id                         └┘  
src                        └┘   
typ                        └┘  
doc                        └┘
123    lt_of_le_of_lt (nat.zero_le n) (n_lt_xn n)
id     └────────────┘  └─────────┘    └─────┘ 
src    └────────────┘  └─────────┘     └─────┘
typ    └────────────┘  └─────────┘    └─────┘ 
124  
125    lemma eq_pell_lem : ∀n (b:ℤ√d), 1 ≤ b → is_pell b → pell_zd n ≥ b → ∃n, b = pell_zd n
id                              └┘         └─────┘    └─────┘         └─────┘ 
src                              └┘          └─────┘     └─────┘             └─────┘
typ                             └┘         └─────┘    └─────┘         └─────┘ 
doc                              └┘            └─────┘     └─────┘                 └─────┘
126    | 0     b := λh1 hp hl, ⟨0, @zsqrtd.le_antisymm _ dnsq _ _ hl h1⟩
id                   └┘ └┘ └┘       └────────────────┘   └──┘     └┘ └┘
src                                 └────────────────┘   └──┘
typ                  └┘ └┘ └┘       └────────────────┘   └──┘     └┘ └┘
127    | (n+1) b := λh1 hp h,
id                └┘ └┘ 
src        
typ               └┘ └┘ 
128      have a1p : (0:ℤ√d) ≤ ⟨a, 1⟩, from trivial,
id                     └┘               └─────┘
src                    └┘                └─────┘
typ                    └┘               └─────┘
doc                    └┘
129      have am1p : (0:ℤ√d) ≤ ⟨a, -1⟩, from show (_:nat) ≤ _, by simp; exact nat.pred_le _,
id                      └┘                       └─┘                     └─────────┘
src                     └┘                        └─┘         └──┘  └────┘└─────────┘└┘
typ                     └┘                       └─┘         └──┘  └────┘└─────────┘└┘
doc                     └┘                                        └──┘  └────┘           └┘
txt                                                               └──┘  └────┘           └┘
par                                                               └──┘  └────┘           └┘
pid                                                                                     └┘
st                                                               └────────────────────────┘
130      have a1m : (⟨a, 1⟩ * ⟨a, -1⟩ : ℤ√d) = 1, from is_pell_norm.1 is_pell_one,
id                                  └┘           └──────────┘  └─────────┘
src                                   └┘           └──────────┘  └─────────┘
typ                                 └┘           └──────────┘  └─────────┘
doc                                     └┘
131      if ha : b ≥ ⟨↑a, 1⟩ then
id       └┘          
src      └┘          
typ      └┘          
132        let ⟨m, e⟩ := eq_pell_lem n (b * ⟨a, -1⟩)
id         └─┘          └─────────┘          
src                                            
typ        └─┘          └─────────┘          
133          (by rw ← a1m; exact mul_le_mul_of_nonneg_right ha am1p)
id                    └─┘        └────────────────────────┘ └┘ └──┘
src              └───┘     └────┘└────────────────────────┘  
typ              └───┘└─┘  └────┘└────────────────────────┘└┘└──┘
doc              └───┘     └────┘                            
txt              └───┘     └────┘                            
par              └───┘     └────┘                            
pid                └─┘                                      
st              └─────────────────────────────────────────────────┘
134          (is_pell_mul hp (is_pell_conj.1 is_pell_one))
id            └─────────┘ └┘  └──────────┘  └─────────┘
src           └─────────┘     └──────────┘  └─────────┘
typ           └─────────┘ └┘  └──────────┘  └─────────┘
135          (by have t := mul_le_mul_of_nonneg_right h am1p; rwa [pell_zd_succ, mul_assoc, a1m, mul_one] at t) in
id                         └────────────────────────┘  └──┘       └──────────┘  └───────┘  └─┘  └─────┘
src              └────────┘└────────────────────────┘       └───┘└──────────┘└┘└───────┘└┘   └┘└─────┘└────┘
typ              └────────┘└────────────────────────┘└──┘  └───┘└──────────┘└┘└───────┘└┘└─┘└┘└─────┘└────┘
doc              └────────┘                                 └───┘            └┘         └┘   └┘       └────┘
txt              └────────┘                                 └───┘            └┘         └┘   └┘       └────┘
par              └────────┘                                 └───┘            └┘         └┘   └┘       └────┘
pid              └────┘└─┘                                    └┘            └┘         └┘   └┘       └───┘
st              └─────────────────────────────────────────────────┘└──────────┘└─────────┘└───┘└───────┘└───┘
136        ⟨m+1, by rw [show b = b * ⟨a, -1⟩ * ⟨a, 1⟩, by rw [mul_assoc, eq.trans (mul_comm _ _) a1m]; simp, pell_zd_succ, e]⟩
id                                                      └───────┘  └──────┘  └──────┘      └─┘         └──────────┘  
src                └──┘        └┘└─┘   └───────────┘└───────┘└┘└──────┘ └──────┘└────┘   └─┘└──┘└┘└──────────┘└┘ 
typ                └──┘       └┘└─┘  └───────────┘└───────┘└┘└──────┘ └──────┘└────┘└─┘└─┘└──┘└┘└──────────┘└┘
doc                 └──┘          └┘ └─┘   └───────────┘         └┘                 └────┘   └─┘└──┘└┘            └┘ 
txt                 └──┘          └┘ └─┘   └───────────┘         └┘                 └────┘   └─┘└──┘└┘            └┘ 
par                 └──┘          └┘ └─┘   └───────────┘         └┘                 └────┘   └─┘└──┘└┘            └┘ 
pid                   └┘          └┘ └─┘   └───────────┘         └┘                 └────┘   └───────┘            └┘ 
st                 └────────────────────────────────────┘└────────────┘└───────────────────────────┘└────┘└────────────┘└─┘
137      else
138        suffices ¬1 < b, from ⟨0, show b = 1, from (or.resolve_left (lt_or_eq_of_le h1) this).symm⟩, λh1l,
id         └──────┘                                 └─────────────┘  └────────────┘ └┘  └──┘ └──┘     └─┘
src        └──────┘                                 └─────────────┘  └────────────┘          └──┘
typ        └──────┘                                 └─────────────┘  └────────────┘ └┘  └──┘ └──┘     └─┘
139        by cases b with x y; exact
id                  
src           └────┘ └───────┘  └─────
typ           └────┘└───────┘  └─────
doc           └────┘ └───────┘  └─────
txt           └────┘ └───────┘  └─────
par           └────┘ └───────┘  └─────
pid                 └───────┘       
st           └────────────────────────
140        have bm : (_*⟨_,_⟩ :ℤ√(d a1)) = 1, from pell.is_pell_norm.1 hp,
id                                                                     └┘
src  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘  └─
typ  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘└┘└─
doc  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘  └─
txt  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘  └─
par  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘  └─
pid  ─────┘    └────┘   └────┘      └─┘ └───────┘                 └─┘  └─
st   ──────────────────────────────────────────────────────────────────────
141        have y0l : (0:ℤ√(d a1)) < ⟨x - x, y - -y⟩, from sub_lt_sub h1l $ λ(hn : (1:ℤ√(d a1)) ≤ ⟨x, -y⟩),
id                                                       └────────┘ └─┘                 └┘        
src  ─────┘    └─────┘ └┘      └─┘   └┘    └──────┘└────────┘     └────┘ └┘     └─┘   └┘  └───
typ  ─────┘    └─────┘ └┘      └─┘   └┘    └──────┘└────────┘└─┘  └────┘ └┘   └┘└─┘ └┘ └───
doc  ─────┘    └─────┘ └┘      └─┘     └┘    └──────┘               └────┘ └┘      └─┘   └┘  └───
txt  ─────┘    └─────┘ └┘      └─┘     └┘    └──────┘               └────┘ └┘      └─┘   └┘  └───
par  ─────┘    └─────┘ └┘      └─┘     └┘    └──────┘               └────┘ └┘      └─┘   └┘  └───
pid  ─────┘    └─────┘ └┘      └─┘     └┘    └──────┘               └────┘ └┘      └─┘   └┘  └───
st   ───────────────────────────────────────────────────────────────────────────────────────────────────────
142          by have t := mul_le_mul_of_nonneg_left hn (le_trans zero_le_one h1); rw [bm, mul_one] at t; exact h1l t,
id                        └───────────────────────┘ └┘  └──────┘ └─────────┘ └┘       └┘  └─────┘              └─┘ 
src  ───────┘  └────────┘└───────────────────────┘   └──────┘└─────────┘  └┘└──┘  └┘└─────┘└────┘└──────┘    └─
typ  ───────┘  └────────┘└───────────────────────┘└┘ └──────┘└─────────┘└┘└┘└──┘└┘└┘└─────┘└────┘└──────┘└─┘└─
doc  ───────┘  └────────┘                                                 └┘└──┘  └┘       └────┘└──────┘    └─
txt  ───────┘  └────────┘                                                 └┘└──┘  └┘       └────┘└──────┘    └─
par  ───────┘  └────────┘                                                 └┘└──┘  └┘       └────┘└──────┘    └─
pid  ───────┘  └─────────┘                                                 └─────┘  └┘       └────────────┘    └─
st   ─────────┘└─────────────────────────────────────────────────────────────────────┘└┘└───────┘└────────────────┘└─
143        have yl2 : (⟨_, _⟩ : ℤ√_) < ⟨_, _⟩, from
src  ─────┘    └─────┘  └──────┘  └─┘  └───────────
typ  ─────┘    └─────┘  └──────┘  └─┘  └───────────
doc  ─────┘    └─────┘  └──────┘  └─┘  └───────────
txt  ─────┘    └─────┘  └──────┘  └─┘  └───────────
par  ─────┘    └─────┘  └──────┘  └─┘  └───────────
pid  ─────┘    └─────┘  └──────┘  └─┘  └───────────
st   ───────────────────────────────────────────────
144          show (⟨x, y⟩ - ⟨x, -y⟩ : ℤ√(d a1)) < ⟨a, 1⟩ - ⟨a, -1⟩, from
id                                              
src  ───────┘       └┘ └┘   └┘  └──┘      └─┘   └───┘   └┘ └────────
typ  ───────┘       └┘ └┘   └┘  └──┘      └─┘  └───┘   └┘ └────────
doc  ───────┘       └┘ └┘   └┘  └──┘      └─┘   └───┘   └┘ └────────
txt  ───────┘       └┘ └┘   └┘  └──┘      └─┘   └───┘   └┘ └────────
par  ───────┘       └┘ └┘   └┘  └──┘      └─┘   └───┘   └┘ └────────
pid  ───────┘       └┘ └┘   └┘  └──┘      └─┘   └───┘   └┘ └────────
st   ────────────────────────────────────────────────────────────────────
145          sub_lt_sub (by exact ha) $ λ(hn : (⟨x, -y⟩ : ℤ√(d a1)) ≤ ⟨a, -1⟩),
id                                └┘                                  
src  ───────┘             └─────┘  └┘  └────┘   └┘  └──┘      └─┘  └┘ └────
typ  ───────┘             └─────┘└┘└┘  └────┘   └┘  └──┘      └─┘ └┘ └────
doc  ───────┘             └─────┘  └┘  └────┘   └┘  └──┘      └─┘   └┘ └────
txt  ───────┘             └─────┘  └┘  └────┘   └┘  └──┘      └─┘   └┘ └────
par  ───────┘             └─────┘  └┘  └────┘   └┘  └──┘      └─┘   └┘ └────
pid  ───────┘             └─────┘  └┘  └────┘   └┘  └──┘      └─┘   └┘ └────
st   ─────────────────────┘└───────┘└───────────────────────────────────────────
146          by have t := mul_le_mul_of_nonneg_right (mul_le_mul_of_nonneg_left hn (le_trans zero_le_one h1)) a1p;
id                        └────────────────────────┘  └───────────────────────┘ └┘  └──────┘ └─────────┘ └┘   └─┘
src  ───────┘  └────────┘└────────────────────────┘ └───────────────────────┘   └──────┘└─────────┘  └─┘   └─
typ  ───────┘  └────────┘└────────────────────────┘ └───────────────────────┘└┘ └──────┘└─────────┘└┘└─┘└─┘└─
doc  ───────┘  └────────┘                                                                            └─┘   └─
txt  ───────┘  └────────┘                                                                            └─┘   └─
par  ───────┘  └────────┘                                                                            └─┘   └─
pid  ───────┘  └─────────┘                                                                            └─┘   └─
st   ─────────┘└───────────────────────────────────────────────────────────────────────────────────────────────────
147             rw [bm, one_mul, mul_assoc, eq.trans (mul_comm _ _) a1m, mul_one] at t; exact ha t,
id                  └┘  └─────┘  └───────┘  └──────┘  └──────┘      └─┘  └─────┘              └┘ 
src  ──────────┘└──┘  └┘└─────┘└┘└───────┘└┘└──────┘ └──────┘└────┘   └┘└─────┘└────┘└──────┘   └─
typ  ──────────┘└──┘└┘└┘└─────┘└┘└───────┘└┘└──────┘ └──────┘└────┘└─┘└┘└─────┘└────┘└──────┘└┘└─
doc  ──────────┘└──┘  └┘       └┘         └┘                 └────┘   └┘       └────┘└──────┘   └─
txt  ──────────┘└──┘  └┘       └┘         └┘                 └────┘   └┘       └────┘└──────┘   └─
par  ──────────┘└──┘  └┘       └┘         └┘                 └────┘   └┘       └────┘└──────┘   └─
pid  ──────────────┘  └┘       └┘         └┘                 └────┘   └┘       └────────────┘   └─
st   ──────────────┘└┘└───────┘└─────────┘└───────────────────────────┘└───────┘└───────────────┘└─
148        by simp at y0l; simp at yl2; exact
src  ─────┘  └─────────┘└┘└─────────┘└───────
typ  ─────┘  └─────────┘└┘└─────────┘└───────
doc  ─────┘  └─────────┘└┘└─────────┘└───────
txt  ─────┘  └─────────┘└┘└─────────┘└───────
par  ─────┘  └─────────┘└┘└─────────┘└───────
pid  ─────┘  └────────────────────────────────
st   ───────┘└────────────────────────────────
149        match y, y0l, (yl2 : (⟨_, _⟩ : ℤ√_) < ⟨_, _⟩) with
id                 └─┘   └─┘
src  ─────┘      └┘   └┘    └─┘  └──────┘  └─┘  └───────────
typ  ─────┘     └┘└─┘└┘ └─┘└─┘  └──────┘  └─┘  └───────────
doc  ─────┘      └┘   └┘    └─┘  └──────┘  └─┘  └───────────
txt  ─────┘      └┘   └┘    └─┘  └──────┘  └─┘  └───────────
par  ─────┘      └┘   └┘    └─┘  └──────┘  └─┘  └───────────
pid  ─────┘      └┘   └┘    └─┘  └──────┘  └─┘  └───────────
st   ─────────────────────────────────────────────────────────
150        | 0, y0l, yl2 := y0l (le_refl 0)
id              └─┘
src  ──────────┘   └┘   └──┘           └───
typ  ──────────┘└─┘└┘   └──┘           └───
doc  ──────────┘   └┘   └──┘           └───
txt  ──────────┘   └┘   └──┘           └───
par  ──────────┘   └┘   └──┘           └───
pid  ──────────┘   └┘   └──┘           └───
st   ───────────────────────────────────────
151        | (y+1 : ℕ), y0l, yl2 := yl2 (zsqrtd.le_of_le_le (le_refl 0)
id                         └─┘         └────────────────┘  └─────┘
src  ───────┘  └──┘ └─┘   └┘   └──┘    └────────────────┘ └─────┘└───
typ  ───────┘ └──┘ └─┘   └┘└─┘└──┘    └────────────────┘ └─────┘└───
doc  ───────┘   └──┘ └─┘   └┘   └──┘                              └───
txt  ───────┘   └──┘ └─┘   └┘   └──┘                              └───
par  ───────┘   └──┘ └─┘   └┘   └──┘                              └───
pid  ───────┘   └──┘ └─┘   └┘   └──┘                              └───
st   ───────────────────────────────────────────────────────────────────
152            (let t := int.coe_nat_le_coe_nat_of_le (nat.succ_pos y) in add_le_add t t))
id                       └──────────────────────────┘  └──────────┘       └────────┘
src  ─────────┘    └────┘└──────────────────────────┘ └──────────┘ └───┘└────────┘  └──
typ  ─────────┘    └────┘└──────────────────────────┘ └──────────┘ └───┘└────────┘  └──
doc  ─────────┘    └────┘                                          └───┘            └──
txt  ─────────┘    └────┘                                          └───┘            └──
par  ─────────┘    └────┘                                          └───┘            └──
pid  ─────────┘    └────┘                                          └───┘            └──
st   ──────────────────────────────────────────────────────────────────────────────────────
153        | -[1+y], y0l, yl2 := y0l trivial
id                   └─┘             └─────┘
src  ───────┘      └┘   └┘   └──┘   └─────┘
typ  ───────┘      └┘└─┘└┘   └──┘   └─────┘
doc  ───────┘      └┘   └┘   └──┘          
txt  ───────┘      └┘   └┘   └──┘          
par  ───────┘      └┘   └┘   └──┘          
pid  ───────┘      └┘   └┘   └──┘          
st   ────────────────────────────────────────
154        end
src  ──────────
typ  ──────────
doc  ──────────
txt  ──────────
par  ──────────
pid  ──────────
st   ──────────
155  
src  
typ  
doc  
txt  
par  
pid  
st   
156    theorem eq_pell_zd (b : ℤ√d) (b1 : 1 ≤ b) (hp : is_pell b) : ∃n, b = pell_zd n :=
id                             └┘                   └─────┘        └─────┘ 
src  ─┘                        └┘                    └─────┘           └─────┘
typ  ─┘                        └┘                   └─────┘        └─────┘ 
doc  ─┘                        └┘                      └─────┘              └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
157    let ⟨n, h⟩ := @zsqrtd.le_arch d b in
id     └─┘          └────────────┘  
src                   └────────────┘ 
typ    └─┘          └────────────┘  
158    eq_pell_lem n b b1 hp $ zsqrtd.le_trans h $ by rw zsqrtd.coe_nat_val; exact
id     └─────────┘    └┘ └┘   └─────────────┘           └────────────────┘
src    └─────────┘             └─────────────┘        └─┘└────────────────┘  └─────
typ    └─────────┘    └┘ └┘   └─────────────┘        └─┘└────────────────┘  └─────
doc                                                   └─┘                    └─────
txt                                                   └─┘                    └─────
par                                                   └─┘                    └─────
pid                                                                              
st                                                   └─────────────────────────────
159    zsqrtd.le_of_le_le
id     └────────────────┘
src  ─┘└────────────────┘
typ  ─┘└────────────────┘
doc  ─┘                  
txt  ─┘                  
par  ─┘                  
pid  ─┘                  
st   ─────────────────────
160      (int.coe_nat_le_coe_nat_of_le $ le_of_lt $ n_lt_xn _ _) (int.coe_zero_le _)
id        └──────────────────────────┘   └──────┘   └─────┘       └─────────────┘
src  ───┘ └──────────────────────────┘ └──────┘ └─────┘└────┘ └─────────────┘└───
typ  ───┘ └──────────────────────────┘ └──────┘ └─────┘└────┘ └─────────────┘└───
doc  ───┘                                              └────┘                └───
txt  ───┘                                              └────┘                └───
par  ───┘                                              └────┘                └───
pid  ───┘                                              └────┘                └─┘
st   ────────────────────────────────────────────────────────────────────────────────
161  
src  
typ  
doc  
txt  
par  
pid  
st   
162    theorem eq_pell {x y : ℕ} (hp : x*x - d*y*y = 1) : ∃n, x = xn n ∧ y = yn n :=
id                                                └┘     └┘ 
src  ─┘                                                 └┘       └┘
typ  ─┘                                           └┘     └┘ 
doc  ─┘                                                           └┘         └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
163    have (1:ℤ√d) ≤ ⟨x, y⟩, from match x, hp with
id             └┘                      └┘
src            └┘  
typ            └┘                      └┘
doc            └┘
164    | 0,    (hp : 0 - _ = 1) := by rw nat.zero_sub at hp; contradiction
id                                     └──────────┘
src                                 └─┘└──────────┘└────┘  └─────────────
typ                                 └─┘└──────────┘└────┘  └─────────────
doc                                   └─┘            └────┘  └─────────────
txt                                   └─┘            └────┘  └─────────────
par                                   └─┘            └────┘  └─────────────
pid                                                 └────┘               
st                                   └─────────────────────────────────────
165    | (x+1), hp := zsqrtd.le_of_le_le (int.coe_nat_le_coe_nat_of_le $ nat.succ_pos x) (int.coe_zero_le _)
id                  └────────────────┘  └──────────────────────────┘   └──────────┘     └─────────────┘
src  ─┘              └────────────────┘  └──────────────────────────┘   └──────────┘     └─────────────┘
typ  ─┘             └────────────────┘  └──────────────────────────┘   └──────────┘     └─────────────┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
166    end,
167    let ⟨m, e⟩ := eq_pell_zd ⟨x, y⟩ this (is_pell_nat.2 hp) in
id     └─┘         └────────┘      └──┘  └─────────┘  └┘
src                  └────────┘              └─────────┘
typ    └─┘         └────────┘      └──┘  └─────────┘  └┘
168    ⟨m, match x, y, e with ._, ._, rfl := ⟨rfl, rfl⟩ end⟩
id                                  └─┘     └─┘  └─┘
src                                   └─┘     └─┘  └─┘
typ                                 └─┘     └─┘  └─┘
169  
170    theorem pell_zd_add (m) : ∀ n, pell_zd (m + n) = pell_zd m * pell_zd n
id                                   └─────┘       └─────┘   └─────┘ 
src                                   └─────┘         └─────┘    └─────┘
typ                                  └─────┘       └─────┘   └─────┘ 
doc                                   └─────┘           └─────┘     └─────┘
171    | 0     := (mul_one _).symm
id                 └─────┘   └──┘
src                └─────┘   └──┘
typ                └─────┘   └──┘
172    | (n+1) := by rw[← add_assoc, pell_zd_succ, pell_zd_succ, pell_zd_add n, ← mul_assoc]
id                       └───────┘  └──────────┘  └──────────┘  └─────────┘     └───────┘
src                 └───┘└───────┘└┘└──────────┘└┘└──────────┘└┘            └──┘└───────┘└─
typ                 └───┘└───────┘└┘└──────────┘└┘└──────────┘└┘└─────────┘└──┘└───────┘└─
doc                  └───┘         └┘            └┘            └┘            └──┘         └─
txt                  └───┘         └┘            └┘            └┘            └──┘         └─
par                  └───┘         └┘            └┘            └┘            └──┘         └─
pid                    └─┘         └┘            └┘            └┘            └──┘         
st                  └─────────────┘└────────────┘└────────────┘└─────────────┘└───────────┘
173  
src  
typ  
doc  
txt  
par  
pid  
st   
174    theorem xn_add (m n) : xn (m + n) = xn m * xn n + d * yn m * yn n :=
id                            └┘       └┘   └┘     └┘   └┘ 
src  ─┘                       └┘         └┘    └┘      └┘    └┘
typ  ─┘                       └┘       └┘   └┘     └┘   └┘ 
doc  ─┘                       └┘           └┘     └┘         └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
175    by injection (pell_zd_add _ m n) with h _;
id                   └─────────┘    
src       └────────┘ └─────────┘└─┘  └────────┘
typ       └────────┘ └─────────┘└─┘└────────┘
doc       └────────┘            └─┘  └────────┘
txt       └────────┘            └─┘  └────────┘
par       └────────┘            └─┘  └────────┘
pid                            └─┘  └───────┘
st       └────────────────────────────────────────
176       repeat {rw ← int.coe_nat_add at h <|> rw ← int.coe_nat_mul at h};
id                     └─────────────┘               └─────────────┘
src       └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘
typ       └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘
doc       └──────┘└───┘               └────┘└──┘└───┘               └───┘
txt       └──────┘└───┘               └────┘└──┘└───┘               └───┘
par       └──────┘└───┘               └────┘└──┘└───┘               └───┘
pid             └─────┘               └─────────────┘               └────┘
st   ────────────┘└─────────────────────────────────────────────────────┘└┘
177       exact int.coe_nat_inj h
id              └─────────────┘ 
src       └────┘└─────────────┘ 
typ       └────┘└─────────────┘
doc       └────┘                
txt       └────┘                
par       └────┘                
pid                            
st   ─────────────────────────────
178  
src  
typ  
doc  
txt  
par  
pid  
st   
179    theorem yn_add (m n) : yn (m + n) = xn m * yn n + yn m * xn n :=
id                            └┘       └┘   └┘   └┘   └┘ 
src  ─┘                       └┘         └┘    └┘    └┘    └┘
typ  ─┘                       └┘       └┘   └┘   └┘   └┘ 
doc  ─┘                       └┘           └┘     └┘     └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
180    by injection (pell_zd_add _ m n) with _ h;
id                   └─────────┘    
src       └────────┘ └─────────┘└─┘  └────────┘
typ       └────────┘ └─────────┘└─┘└────────┘
doc       └────────┘            └─┘  └────────┘
txt       └────────┘            └─┘  └────────┘
par       └────────┘            └─┘  └────────┘
pid                            └─┘  └───────┘
st       └────────────────────────────────────────
181       repeat {rw ← int.coe_nat_add at h <|> rw ← int.coe_nat_mul at h};
id                     └─────────────┘               └─────────────┘
src       └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘
typ       └──────┘└───┘└─────────────┘└────┘└──┘└───┘└─────────────┘└───┘
doc       └──────┘└───┘               └────┘└──┘└───┘               └───┘
txt       └──────┘└───┘               └────┘└──┘└───┘               └───┘
par       └──────┘└───┘               └────┘└──┘└───┘               └───┘
pid             └─────┘               └─────────────┘               └────┘
st   ────────────┘└─────────────────────────────────────────────────────┘└┘
182       exact int.coe_nat_inj h
id              └─────────────┘ 
src       └────┘└─────────────┘ 
typ       └────┘└─────────────┘
doc       └────┘                
txt       └────┘                
par       └────┘                
pid                            
st   ─────────────────────────────
183  
src  
typ  
doc  
txt  
par  
pid  
st   
184    theorem pell_zd_sub {m n} (h : n ≤ m) : pell_zd (m - n) = pell_zd m * (pell_zd n).conj :=
id                                          └─────┘       └─────┘    └─────┘  └──┘
src  ─┘                                       └─────┘         └─────┘     └─────┘   └──┘
typ  ─┘                                     └─────┘       └─────┘    └─────┘  └──┘
doc  ─┘                                        └─────┘           └─────┘      └─────┘   └──┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
185    let t := pell_zd_add n (m - n) in
id             └─────────┘     
src             └─────────┘      
typ            └─────────┘     
186    by rw [nat.add_sub_of_le h] at t;
id            └───────────────┘ 
src       └──┘└───────────────┘ └────┘
typ       └──┘└───────────────┘└────┘
doc       └──┘                  └────┘
txt       └──┘                  └────┘
par       └──┘                  └────┘
pid         └┘                  └───┘
st       └──────────────────────┘└──────
187       rw [t, mul_comm (pell_zd _ n) _, mul_assoc, (is_pell_norm _).1 (is_pell_pell_zd _ _), mul_one]
id              └──────┘  └─────┘        └───────┘   └──────────┘       └─────────────┘       └─────┘
src       └──┘ └┘└──────┘ └─────┘└─┘ └───┘└───────┘└┘ └──────────┘└────┘ └─────────────┘└─────┘└─────┘└─
typ       └──┘└┘└──────┘ └─────┘└─┘└───┘└───────┘└┘ └──────────┘└────┘ └─────────────┘└─────┘└─────┘└─
doc       └──┘ └┘         └─────┘└─┘ └───┘         └┘             └────┘                └─────┘       └─
txt       └──┘ └┘                └─┘ └───┘         └┘             └────┘                └─────┘       └─
par       └──┘ └┘                └─┘ └───┘         └┘             └────┘                └─────┘       └─
pid         └┘ └┘                └─┘ └───┘         └┘             └────┘                └─────┘       
st   ────────┘└────────────────────────┘└─────────┘└────────────────────────────────────────┘└───────┘
188  
src  
typ  
doc  
txt  
par  
pid  
st   
189    theorem xz_sub {m n} (h : n ≤ m) : xz (m - n) = xz m * xz n - d * yz m * yz n :=
id                                     └┘       └┘   └┘     └┘   └┘ 
src  ─┘                                  └┘         └┘    └┘      └┘    └┘
typ  ─┘                                └┘       └┘   └┘     └┘   └┘ 
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
190    by injection (pell_zd_sub _ h) with h _; repeat {rw ← neg_mul_eq_mul_neg at h}; exact h
id                   └─────────┘                            └────────────────┘              
src       └────────┘ └─────────┘└─┘ └────────┘  └──────┘└───┘└────────────────┘└───┘  └────┘ 
typ       └────────┘ └─────────┘└─┘└────────┘  └──────┘└───┘└────────────────┘└───┘  └────┘
doc       └────────┘            └─┘ └────────┘  └──────┘└───┘                  └───┘  └────┘ 
txt       └────────┘            └─┘ └────────┘  └──────┘└───┘                  └───┘  └────┘ 
par       └────────┘            └─┘ └────────┘  └──────┘└───┘                  └───┘  └────┘ 
pid                            └─┘ └───────┘        └─────┘                  └────┘        
st       └─────────────────────────────────────────────┘└──────────────────────────┘└┘└────────
191  
src  
typ  
doc  
txt  
par  
pid  
st   
192    theorem yz_sub {m n} (h : n ≤ m) : yz (m - n) = xz n * yz m - xz m * yz n :=
id                                     └┘       └┘   └┘   └┘   └┘ 
src  ─┘                                  └┘         └┘    └┘    └┘    └┘
typ  ─┘                                └┘       └┘   └┘   └┘   └┘ 
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
193    by injection (pell_zd_sub a1 h) with _ h; repeat {rw ← neg_mul_eq_mul_neg at h}; rw [add_comm, mul_comm] at h; exact h
id                   └─────────┘ └┘                          └────────────────┘            └──────┘  └──────┘              
src       └────────┘ └─────────┘   └────────┘  └──────┘└───┘└────────────────┘└───┘  └──┘└──────┘└┘└──────┘└────┘  └────┘ 
typ       └────────┘ └─────────┘└┘└────────┘  └──────┘└───┘└────────────────┘└───┘  └──┘└──────┘└┘└──────┘└────┘  └────┘
doc       └────────┘               └────────┘  └──────┘└───┘                  └───┘  └──┘        └┘        └────┘  └────┘ 
txt       └────────┘               └────────┘  └──────┘└───┘                  └───┘  └──┘        └┘        └────┘  └────┘ 
par       └────────┘               └────────┘  └──────┘└───┘                  └───┘  └──┘        └┘        └────┘  └────┘ 
pid                               └───────┘        └─────┘                  └────┘    └┘        └┘        └───┘        
st       └──────────────────────────────────────────────┘└──────────────────────────┘└┘└───┘└──────┘└────────┘└──────────────
194  
src  
typ  
doc  
txt  
par  
pid  
st   
195    theorem xy_coprime (n) : (xn n).coprime (yn n) :=
id                               └┘  └─────┘   └┘ 
src  ─┘                          └┘   └─────┘   └┘
typ  ─┘                          └┘  └─────┘   └┘ 
doc  ─┘                          └┘             └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
196    nat.coprime_of_dvd' $ λk kx ky,
id     └─────────────────┘     └┘ └┘
src    └─────────────────┘
typ    └─────────────────┘     └┘ └┘
197    let p := pell_eq n in by rw ← p; exact
id             └─────┘             
src             └─────┘         └───┘   └─────
typ            └─────┘        └───┘  └─────
doc                             └───┘   └─────
txt                             └───┘   └─────
par                             └───┘   └─────
pid                               └─┘        
st                             └──────────────
198    nat.dvd_sub (le_of_lt $ nat.lt_of_sub_eq_succ p)
id     └─────────┘  └──────┘   └───────────────────┘ 
src  ─┘└─────────┘ └──────┘ └───────────────────┘ └─
typ  ─┘└─────────┘ └──────┘ └───────────────────┘└─
doc  ─┘                                           └─
txt  ─┘                                           └─
par  ─┘                                           └─
pid  ─┘                                           └─
st   ───────────────────────────────────────────────────
199      (dvd_mul_of_dvd_right kx _) (dvd_mul_of_dvd_right ky _)
id                             └┘     └──────────────────┘ └┘
src  ───┘                       └──┘ └──────────────────┘  └───
typ  ───┘                     └┘└──┘ └──────────────────┘└┘└───
doc  ───┘                       └──┘                       └───
txt  ───┘                       └──┘                       └───
par  ───┘                       └──┘                       └───
pid  ───┘                       └──┘                       └─┘
st   ────────────────────────────────────────────────────────────
200  
src  
typ  
doc  
txt  
par  
pid  
st   
201    theorem y_increasing {m} : Π {n}, m < n → yn m < yn n
id                                          └┘   └┘ 
src  ─┘                                         └┘    └┘
typ  ─┘                                     └┘   └┘ 
doc  ─┘                                          └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
202    | 0     h := absurd h $ nat.not_lt_zero _
id                 └────┘     └─────────────┘
src                 └────┘     └─────────────┘
typ                └────┘     └─────────────┘
203    | (n+1) h :=
id           
src        
typ          
204      have yn m ≤ yn n, from or.elim (lt_or_eq_of_le $ nat.le_of_succ_le_succ h)
id            └┘   └┘         └─────┘  └────────────┘   └────────────────────┘
src           └┘    └┘         └─────┘  └────────────┘   └────────────────────┘
typ           └┘   └┘         └─────┘  └────────────┘   └────────────────────┘
doc           └┘     └┘
205        (λhl, le_of_lt $ y_increasing hl) (λe, by rw e),
id           └┘  └──────┘   └──────────┘ └┘            
src              └──────┘                            └─┘
typ          └┘  └──────┘   └──────────┘ └┘         └─┘
doc                                                  └─┘
txt                                                  └─┘
par                                                  └─┘
pid                                                    
st                                                  └───┘
206      by simp; refine lt_of_le_of_lt _ (nat.lt_add_of_pos_left $ x_pos a1 n);
id                       └────────────┘    └────────────────────┘   └───┘ └┘ 
src         └──┘  └─────┘└────────────┘└─┘ └────────────────────┘ └───┘   
typ         └──┘  └─────┘└────────────┘└─┘ └────────────────────┘ └───┘└┘
doc         └──┘  └─────┘              └─┘                                
txt         └──┘  └─────┘              └─┘                                
par         └──┘  └─────┘              └─┘                                
pid                                   └─┘                                
st         └─────────────────────────────────────────────────────────────────────
207         rw ← mul_one (yn a1 m);
id               └─────┘  └┘ └┘ 
src         └───┘└─────┘ └┘   
typ         └───┘└─────┘ └┘└┘
doc         └───┘        └┘   
txt         └───┘             
par         └───┘             
pid           └─┘             
st   ───────────────────────────────
208         exact mul_le_mul this (le_of_lt a1) (nat.zero_le _) (nat.zero_le _)
id                └────────┘ └──┘  └──────┘ └┘                   └─────────┘
src         └────┘└────────┘     └──────┘  └┘            └──┘ └─────────┘└───
typ         └────┘└────────┘└──┘ └──────┘└┘└┘            └──┘ └─────────┘└───
doc         └────┘                         └┘            └──┘            └───
txt         └────┘                         └┘            └──┘            └───
par         └────┘                         └┘            └──┘            └───
pid                                       └┘            └──┘            └─┘
st   ───────────────────────────────────────────────────────────────────────────
209  
src  
typ  
doc  
txt  
par  
pid  
st   
210    theorem x_increasing {m} : Π {n}, m < n → xn m < xn n
id                                          └┘   └┘ 
src  ─┘                                         └┘    └┘
typ  ─┘                                     └┘   └┘ 
doc  ─┘                                          └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
211    | 0     h := absurd h $ nat.not_lt_zero _
id                 └────┘     └─────────────┘
src                 └────┘     └─────────────┘
typ                └────┘     └─────────────┘
212    | (n+1) h :=
id           
src        
typ          
213      have xn m ≤ xn n, from or.elim (lt_or_eq_of_le $ nat.le_of_succ_le_succ h)
id            └┘   └┘         └─────┘  └────────────┘   └────────────────────┘
src           └┘    └┘         └─────┘  └────────────┘   └────────────────────┘
typ           └┘   └┘         └─────┘  └────────────┘   └────────────────────┘
doc           └┘     └┘
214        (λhl, le_of_lt $ x_increasing hl) (λe, by rw e),
id           └┘  └──────┘   └──────────┘ └┘            
src              └──────┘                            └─┘
typ          └┘  └──────┘   └──────────┘ └┘         └─┘
doc                                                  └─┘
txt                                                  └─┘
par                                                  └─┘
pid                                                    
st                                                  └───┘
215      by simp; refine lt_of_lt_of_le (lt_of_le_of_lt this _) (nat.le_add_right _ _);
id                       └────────────┘  └────────────┘ └──┘     └──────────────┘
src         └──┘  └─────┘└────────────┘ └────────────┘    └──┘ └──────────────┘└───┘
typ         └──┘  └─────┘└────────────┘ └────────────┘└──┘└──┘ └──────────────┘└───┘
doc         └──┘  └─────┘                                 └──┘                 └───┘
txt         └──┘  └─────┘                                 └──┘                 └───┘
par         └──┘  └─────┘                                 └──┘                 └───┘
pid                                                      └──┘                 └───┘
st         └────────────────────────────────────────────────────────────────────────────
216         have t := nat.mul_lt_mul_of_pos_left a1 (x_pos a1 n); rwa mul_one at t
id                    └────────────────────────┘     └───┘ └┘        └─────┘
src         └────────┘└────────────────────────┘   └───┘     └──┘└─────┘└─────
typ         └────────┘└────────────────────────┘   └───┘└┘  └──┘└─────┘└─────
doc         └────────┘                                       └──┘       └─────
txt         └────────┘                                       └──┘       └─────
par         └────────┘                                       └──┘       └─────
pid         └────┘└─┘                                                 └───┘
st   ────────────────────────────────────────────────────────────────┘└─────┘└─────
217  
src  
typ  
doc  
txt  
par  
pid  
st   
218    theorem yn_ge_n : Π n, n ≤ yn n
id                             └┘ 
src  ─┘                          └┘
typ  ─┘                        └┘ 
doc  ─┘                           └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
219    | 0 := nat.zero_le _
id            └─────────┘
src           └─────────┘
typ           └─────────┘
220    | (n+1) := show n < yn (n+1), from lt_of_le_of_lt (yn_ge_n n) (y_increasing $ nat.lt_succ_self n)
id                      └┘            └────────────┘  └─────┘     └──────────┘   └──────────────┘
src                      └┘            └────────────┘              └──────────┘   └──────────────┘
typ                     └┘            └────────────┘  └─────┘     └──────────┘   └──────────────┘
doc                        └┘
221  
222    theorem y_mul_dvd (n) : ∀k, yn n ∣ yn (n * k)
id                                └┘   └┘    
src                                └┘    └┘    
typ                               └┘   └┘    
doc                                └┘     └┘
223    | 0     := dvd_zero _
id                └──────┘
src               └──────┘
typ               └──────┘
224    | (k+1) := by rw [nat.mul_succ, yn_add]; exact
id                      └──────────┘  └────┘
src                 └──┘└──────────┘└┘└────┘  └─────
typ                 └──┘└──────────┘└┘└────┘  └─────
doc                  └──┘            └┘        └─────
txt                  └──┘            └┘        └─────
par                  └──┘            └┘        └─────
pid                    └┘            └┘             
st                  └───────────────┘└──────┘└───────
225      dvd_add (dvd_mul_left _ _) (dvd_mul_of_dvd_left (y_mul_dvd k) _)
id       └─────┘  └──────────┘       └─────────────────┘  └───────┘ 
src  ───┘└─────┘ └──────────┘└────┘ └─────────────────┘           └────
typ  ───┘└─────┘ └──────────┘└────┘ └─────────────────┘ └───────┘└────
doc  ───┘                    └────┘                               └────
txt  ───┘                    └────┘                               └────
par  ───┘                    └────┘                               └────
pid  ───┘                    └────┘                               └──┘
st   ─────────────────────────────────────────────────────────────────────
226  
src  
typ  
doc  
txt  
par  
pid  
st   
227    theorem y_dvd_iff (m n) : yn m ∣ yn n ↔ m ∣ n :=
id                               └┘   └┘     
src  ─┘                          └┘    └┘      
typ  ─┘                          └┘   └┘     
doc  ─┘                          └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
228    ⟨λh, nat.dvd_of_mod_eq_zero $ (nat.eq_zero_or_pos _).resolve_right $ λhp,
id         └────────────────────┘    └────────────────┘   └───────────┘     └┘
src         └────────────────────┘    └────────────────┘   └───────────┘
typ        └────────────────────┘    └────────────────┘   └───────────┘     └┘
229      have co : nat.coprime (yn m) (xn (m * (n / m))), from nat.coprime.symm $
id                 └─────────┘  └┘    └┘                 └──────────────┘
src                └─────────┘  └┘     └┘                    └──────────────┘
typ                └─────────┘  └┘    └┘                 └──────────────┘
doc                             └┘     └┘
230        (xy_coprime _).coprime_dvd_right (y_mul_dvd m (n / m)),
id          └────────┘   └───────────────┘   └───────┘     
src         └────────┘   └───────────────┘   └───────┘      
typ         └────────┘   └───────────────┘   └───────┘     
231      have m0 : m > 0, from m.eq_zero_or_pos.resolve_left $
id                           └─────────────┘└───────────┘
src                            └─────────────┘└───────────┘
typ                          └─────────────┘└───────────┘
232        λe, by rw [e, nat.mod_zero] at hp; rw [e] at h; exact
id                     └──────────┘             
src               └──┘ └┘└──────────┘└─────┘  └──┘ └────┘  └─────
typ              └──┘└┘└──────────┘└─────┘  └──┘└────┘  └─────
doc               └──┘ └┘            └─────┘  └──┘ └────┘  └─────
txt               └──┘ └┘            └─────┘  └──┘ └────┘  └─────
par               └──┘ └┘            └─────┘  └──┘ └────┘  └─────
pid                 └┘ └┘            └────┘    └┘ └───┘       
st               └────┘└────────────┘└──────────┘└────────────
233        have 0 < yn a1 n, from y_increasing _ hp,
id                 └┘           └──────────┘   └┘
src  ─────┘    └─┘└┘   └─────┘└──────────┘└─┘  └─
typ  ─────┘    └─┘└┘  └─────┘└──────────┘└─┘└┘└─
doc  ─────┘    └─┘ └┘   └─────┘            └─┘  └─
txt  ─────┘    └─┘      └─────┘            └─┘  └─
par  ─────┘    └─┘      └─────┘            └─┘  └─
pid  ─────┘    └─┘      └─────┘            └─┘  └─
st   ────────────────────────────────────────────────
234        ne_of_lt (y_increasing a1 hp) (eq_zero_of_zero_dvd h).symm,
id         └──────┘               └┘      └─────────────────┘ 
src  ─────┘└──────┘                 └┘ └─────────────────┘ └────┘
typ  ─────┘└──────┘             └┘  └┘ └─────────────────┘└────┘
doc  ─────┘                         └┘                     └────┘
txt  ─────┘                         └┘                     └────┘
par  ─────┘                         └┘                     └────┘
pid  ─────┘                         └┘                     └───┘
st   ───────────────────────────────────────────────────────────────┘
235      by rw [← nat.mod_add_div n m, yn_add] at h; exact
id                └─────────────┘    └────┘
src         └────┘└─────────────┘  └┘└────┘└────┘  └─────
typ         └────┘└─────────────┘└┘└────┘└────┘  └─────
doc         └────┘                 └┘      └────┘  └─────
txt         └────┘                 └┘      └────┘  └─────
par         └────┘                 └┘      └────┘  └─────
pid           └──┘                 └┘      └───┘       
st         └────────────────────────┘└──────┘└────────────
236      not_le_of_gt (y_increasing _ $ nat.mod_lt n m0)
id       └──────────┘                   └────────┘  └┘
src  ───┘└──────────┘             └─┘ └────────┘   └─
typ  ───┘└──────────┘             └─┘ └────────┘└┘└─
doc  ───┘                         └─┘              └─
txt  ───┘                         └─┘              └─
par  ───┘                         └─┘              └─
pid  ───┘                         └─┘              └─
st   ────────────────────────────────────────────────────
237       (nat.le_of_dvd (y_increasing _ hp) $ co.dvd_of_dvd_mul_right $
id         └───────────┘  └──────────┘   └┘    └─────────────────────┘
src  ────┘ └───────────┘ └──────────┘└─┘  └┘ └─────────────────────┘ 
typ  ────┘ └───────────┘ └──────────┘└─┘└┘└┘ └─────────────────────┘ 
doc  ────┘                           └─┘  └┘                         
txt  ────┘                           └─┘  └┘                         
par  ────┘                           └─┘  └┘                         
pid  ────┘                           └─┘  └┘                         
st   ────────────────────────────────────────────────────────────────────
238        (nat.dvd_add_iff_right $ dvd_mul_of_dvd_right (y_mul_dvd _ _ _) _).2 h),
id          └───────────────────┘   └──────────────────┘  └───────┘             
src  ─────┘ └───────────────────┘ └──────────────────┘ └───────┘└───────────┘ 
typ  ─────┘ └───────────────────┘ └──────────────────┘ └───────┘└───────────┘
doc  ─────┘                                                     └───────────┘ 
txt  ─────┘                                                     └───────────┘ 
par  ─────┘                                                     └───────────┘ 
pid  ─────┘                                                     └───────────┘ 
st   ────────────────────────────────────────────────────────────────────────────┘
239    λ⟨k, e⟩, by rw e; apply y_mul_dvd⟩
id                           └───────┘
src                └─┘   └────┘└───────┘
typ               └─┘  └────┘└───────┘
doc                └─┘   └────┘
txt                └─┘   └────┘
par                └─┘   └────┘
pid                          
st                └────────────────────┘
240  
241    theorem xy_modeq_yn (n) :
242      ∀k, xn (n * k) ≡ (xn n)^k [MOD (yn n)^2]
id          └┘        └┘   └──┘  └┘   
src          └┘          └┘     └──┘  └┘    
typ         └┘        └┘   └──┘  └┘   
doc          └┘           └┘      └──┘  └┘     
243        ∧ yn (n * k) ≡ k * (xn n)^(k-1) * yn n [MOD (yn n)^3]
id          └┘          └┘       └┘  └──┘  └┘   
src         └┘             └┘         └┘   └──┘  └┘    
typ         └┘          └┘       └┘  └──┘  └┘   
doc          └┘               └┘            └┘   └──┘  └┘     
244    | 0     := by constructor; simp
src                  └─────────┘  └────
typ                  └─────────┘  └────
doc                  └─────────┘  └────
txt                  └─────────┘  └────
par                  └─────────┘  └────
pid                                   
st                  └──────────────────
245    | (k+1) :=
id        
src  ─┘    
typ  ─┘   
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
246      let ⟨hx, hy⟩ := xy_modeq_yn k in
id       └─┘  └┘         └─────────┘
typ      └─┘  └┘         └─────────┘
247      have L : xn (n * k) * xn n + d * yn (n * k) * yn n ≡ xn n^k * xn n + 0 [MOD yn n^2], from
id                └┘        └┘     └┘        └┘   └┘    └┘     └──┘ └┘  
src               └┘         └┘      └┘         └┘    └┘     └┘      └──┘ └┘   
typ               └┘        └┘     └┘        └┘   └┘    └┘     └──┘ └┘  
doc               └┘           └┘         └┘           └┘    └┘       └┘       └──┘ └┘    
248      modeq.modeq_add (modeq.modeq_mul_right _ hx) $ modeq.modeq_zero_iff.2 $
id       └─────────────┘  └───────────────────┘         └──────────────────┘
src      └─────────────┘  └───────────────────┘         └──────────────────┘
typ      └─────────────┘  └───────────────────┘         └──────────────────┘
249        by rw nat.pow_succ; exact
id               └──────────┘
src           └─┘└──────────┘  └─────
typ           └─┘└──────────┘  └─────
doc           └─┘              └─────
txt           └─┘              └─────
par           └─┘              └─────
pid                                
st           └───────────────────────
250        mul_dvd_mul_right (dvd_mul_of_dvd_right (modeq.modeq_zero_iff.1 $
id         └───────────────┘  └──────────────────┘
src  ─────┘└───────────────┘ └──────────────────┘                     └─┘ 
typ  ─────┘└───────────────┘ └──────────────────┘                     └─┘ 
doc  ─────┘                                                           └─┘ 
txt  ─────┘                                                           └─┘ 
par  ─────┘                                                           └─┘ 
pid  ─────┘                                                           └─┘ 
st   ────────────────────────────────────────────────────────────────────────
251          (hy.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).trans $ modeq.modeq_zero_iff.2 $
id            └──────────────────────┘            └──────────┘           └──────────────────┘
src  ───────┘ └──────────────────────┘   └────┘└──────────┘└──────┘ └──────────────────┘└─┘ 
typ  ───────┘ └──────────────────────┘   └────┘└──────────┘└──────┘ └──────────────────┘└─┘ 
doc  ───────┘                            └────┘            └──────┘                     └─┘ 
txt  ───────┘                            └────┘            └──────┘                     └─┘ 
par  ───────┘                            └────┘            └──────┘                     └─┘ 
pid  ───────┘                            └─────┘            └───────┘                     └─┘ 
st   ─────────────────────────────────────┘└──────────────────┘└──────────────────────────────────
252          by simp [-mul_comm, -mul_assoc]) _) _,
src  ───────┘  └──────────────────────────┘└────┘
typ  ───────┘  └──────────────────────────┘└────┘
doc  ───────┘  └──────────────────────────┘└────┘
txt  ───────┘  └──────────────────────────┘└────┘
par  ───────┘  └──────────────────────────┘└────┘
pid  ───────┘  └─────────────────────────────────┘
st   ─────────┘└───────────────────────────┘└────┘
253      have R : xn (n * k) * yn n + yn (n * k) * xn n ≡
id                └┘        └┘   └┘        └┘  
src               └┘         └┘    └┘         └┘   
typ               └┘        └┘   └┘        └┘  
doc               └┘           └┘     └┘           └┘   
254               xn n^k * yn n + k * xn n^k * yn n [MOD yn n^3], from
id                └┘    └┘      └┘    └┘  └──┘ └┘  
src               └┘     └┘       └┘     └┘   └──┘ └┘   
typ               └┘    └┘      └┘    └┘  └──┘ └┘  
doc               └┘       └┘         └┘       └┘   └──┘ └┘    
255      modeq.modeq_add (by rw nat.pow_succ; exact modeq.modeq_mul_right' _ hx) $
id       └─────────────┘        └──────────┘        └────────────────────┘   └┘
src      └─────────────┘     └─┘└──────────┘  └────┘└────────────────────┘└─┘
typ      └─────────────┘     └─┘└──────────┘  └────┘└────────────────────┘└─┘└┘
doc                          └─┘              └────┘                      └─┘
txt                          └─┘              └────┘                      └─┘
par                          └─┘              └────┘                      └─┘
pid                                                                     └─┘
st                          └─────────────────────────────────────────────────┘
256        have k * xn n^(k - 1) * yn n * xn n = k * xn n^k * yn n,
id                 └┘         └┘   └┘      └┘    └┘ 
src                └┘          └┘    └┘       └┘     └┘
typ                └┘         └┘   └┘      └┘    └┘ 
doc                 └┘             └┘     └┘         └┘       └┘
257          by clear _let_match; cases k with k; simp [nat.pow_succ, mul_comm, mul_left_comm],
id                                                     └──────────┘  └──────┘  └───────────┘
src             └──────────────┘  └────┘ └─────┘  └────┘└──────────┘└┘└──────┘└┘└───────────┘
typ             └──────────────┘  └────┘└─────┘  └────┘└──────────┘└┘└──────┘└┘└───────────┘
doc             └──────────────┘  └────┘ └─────┘  └────┘            └┘        └┘             
txt             └──────────────┘  └────┘ └─────┘  └────┘            └┘        └┘             
par             └──────────────┘  └────┘ └─────┘  └────┘            └┘        └┘             
pid                  └─────────┘        └─────┘                  └┘        └┘             
st             └─────────────────────────────────────────────────────────────────────────────┘
258        by rw ← this; exact modeq.modeq_mul_right _ hy,
id                 └──┘        └───────────────────┘   └┘
src           └───┘      └────┘└───────────────────┘└─┘
typ           └───┘└──┘  └────┘└───────────────────┘└─┘└┘
doc           └───┘      └────┘                     └─┘
txt           └───┘      └────┘                     └─┘
par           └───┘      └────┘                     └─┘
pid             └─┘                                └─┘
st           └──────────────────────────────────────────┘
259      by rw [nat.add_sub_cancel, nat.mul_succ, xn_add, yn_add, nat.pow_succ (xn _ n),
id              └────────────────┘  └──────────┘  └────┘  └────┘  └──────────┘  └┘   
src         └──┘└────────────────┘└┘└──────────┘└┘└────┘└┘└────┘└┘└──────────┘ └┘└─┘ └──
typ         └──┘└────────────────┘└┘└──────────┘└┘└────┘└┘└────┘└┘└──────────┘ └┘└─┘└──
doc         └──┘                  └┘            └┘      └┘      └┘             └┘└─┘ └──
txt         └──┘                  └┘            └┘      └┘      └┘               └─┘ └──
par         └──┘                  └┘            └┘      └┘      └┘               └─┘ └──
pid           └┘                  └┘            └┘      └┘      └┘               └─┘ └──
st         └─────────────────────┘└────────────┘└──────┘└──────┘└─────────────────────┘└─
260             nat.succ_mul, add_comm (k * xn _ n^k) (xn _ n^k), right_distrib];
id              └──────────┘  └──────┘               └┘       └───────────┘
src  ──────────┘└──────────┘└┘└──────┘    └─┘  └┘ └┘└─┘   └─┘└───────────┘
typ  ──────────┘└──────────┘└┘└──────┘    └─┘  └┘ └┘└─┘ └─┘└───────────┘
doc  ──────────┘            └┘             └─┘   └┘ └┘└─┘   └─┘             
txt  ──────────┘            └┘             └─┘   └┘   └─┘   └─┘             
par  ──────────┘            └┘             └─┘   └┘   └─┘   └─┘             
pid  ──────────┘            └┘             └─┘   └┘   └─┘   └─┘             
st   ──────────────────────┘└──────────────────────────────────┘└─────────────┘└─
261         exact ⟨L, R⟩
id                   
src         └────┘  └┘ └─
typ         └────┘ └┘└─
doc         └────┘  └┘ └─
txt         └────┘  └┘ └─
par         └────┘  └┘ └─
pid                └┘ 
st   ────────────────────
262  
src  
typ  
doc  
txt  
par  
pid  
st   
263    theorem ysq_dvd_yy (n) : yn n * yn n ∣ yn (n * yn n) :=
id                              └┘   └┘   └┘    └┘ 
src  ─┘                         └┘    └┘    └┘     └┘
typ  ─┘                         └┘   └┘   └┘    └┘ 
doc  ─┘                         └┘     └┘     └┘      └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
264    modeq.modeq_zero_iff.1 $
id     └──────────────────┘
src    └──────────────────┘
typ    └──────────────────┘
265      ((xy_modeq_yn n (yn n)).right.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).trans
id         └─────────┘   └┘   └───┘ └───────────────────┘             └──────────┘  └───┘
src        └─────────┘    └┘    └───┘ └───────────────────┘       └────┘└──────────┘ └───┘
typ        └─────────┘   └┘   └───┘ └───────────────────┘       └────┘└──────────┘ └───┘
doc                       └┘                                      └────┘            
txt                                                               └────┘            
par                                                               └────┘            
pid                                                                               
st                                                               └──────────────────┘
266      (modeq.modeq_zero_iff.2 $ by simp [mul_dvd_mul_left, mul_assoc])
id        └──────────────────┘             └──────────────┘  └───────┘
src       └──────────────────┘       └────┘└──────────────┘└┘└───────┘
typ       └──────────────────┘       └────┘└──────────────┘└┘└───────┘
doc                                   └────┘                └┘         
txt                                   └────┘                └┘         
par                                   └────┘                └┘         
pid                                                       └┘         
st                                   └─────────────────────────────────┘
267  
268    theorem dvd_of_ysq_dvd {n t} (h : yn n * yn n ∣ yn t) : yn n ∣ t :=
id                                       └┘   └┘   └┘     └┘   
src                                      └┘    └┘    └┘      └┘   
typ                                      └┘   └┘   └┘     └┘   
doc                                      └┘     └┘     └┘      └┘
269    have nt : n ∣ t, from (y_dvd_iff n t).1 $ dvd_of_mul_left_dvd h,
id                         └───────┘       └─────────────────┘ 
src                          └───────┘         └─────────────────┘
typ                        └───────┘       └─────────────────┘ 
270    n.eq_zero_or_pos.elim (λn0, by rw n0; rw n0 at nt; exact nt) $ λ(n0l : n > 0),
id     └─────────────┘└───┘   └┘        └┘     └┘              └┘             
src     └─────────────┘└───┘          └─┘    └─┘  └────┘  └────┘                
typ    └─────────────┘└───┘   └┘     └─┘└┘  └─┘└┘└────┘  └────┘└┘             
doc                                   └─┘    └─┘  └────┘  └────┘
txt                                   └─┘    └─┘  └────┘  └────┘
par                                   └─┘    └─┘  └────┘  └────┘
pid                                             └────┘       
st                                   └─────────┘└┘└──────────────┘
271    let ⟨k, ke⟩ := nt in
id     └─┘           └┘
typ    └─┘           └┘
272    have yn n ∣ k * (xn n)^(k-1), from
id          └┘       └┘    
src         └┘        └┘     
typ         └┘       └┘    
doc         └┘          └┘
273    nat.dvd_of_mul_dvd_mul_right (y_increasing n0l) $ modeq.modeq_zero_iff.1 $
id     └──────────────────────────┘  └──────────┘ └─┘    └──────────────────┘
src    └──────────────────────────┘  └──────────┘        └──────────────────┘
typ    └──────────────────────────┘  └──────────┘ └─┘    └──────────────────┘
274      by have xm := (xy_modeq_yn a1 n k).right; rw ← ke at xm; exact
id                      └─────────┘ └┘                └┘
src         └─────────┘ └─────────┘    └─────┘  └───┘  └────┘  └─────
typ         └─────────┘ └─────────┘└┘└─────┘  └───┘└┘└────┘  └─────
doc         └─────────┘                └─────┘  └───┘  └────┘  └─────
txt         └─────────┘                └─────┘  └───┘  └────┘  └─────
par         └─────────┘                └─────┘  └───┘  └────┘  └─────
pid         └─────┘└─┘                └────┘    └─┘  └────┘       
st         └────────────────────────────────────────────────────────────
275      (xm.modeq_of_dvd_of_modeq $ by simp [nat.pow_succ]).symm.trans
id        └──────────────────────┘            └──────────┘
src  ───┘ └──────────────────────┘   └────┘└──────────┘└────────────
typ  ───┘ └──────────────────────┘   └────┘└──────────┘└────────────
doc  ───┘                            └────┘            └────────────
txt  ───┘                            └────┘            └────────────
par  ───┘                            └────┘            └────────────
pid  ───┘                            └─────┘            └─────────────
st   ─────────────────────────────────┘└──────────────────┘└────────────
276        (modeq.modeq_zero_iff.2 h),
id          └──────────────────┘   
src  ─────┘ └──────────────────┘└─┘ 
typ  ─────┘ └──────────────────┘└─┘
doc  ─────┘                     └─┘ 
txt  ─────┘                     └─┘ 
par  ─────┘                     └─┘ 
pid  ─────┘                     └─┘ 
st   ───────────────────────────────┘
277    by rw ke; exact dvd_mul_of_dvd_right
id           └┘        └──────────────────┘
src       └─┘    └────┘└──────────────────┘
typ       └─┘└┘  └────┘└──────────────────┘
doc       └─┘    └────┘                    
txt       └─┘    └────┘                    
par       └─┘    └────┘                    
pid                                      
st       └──────────────────────────────────
278      (((xy_coprime _ _).pow_left _).symm.dvd_of_dvd_mul_right this) _
id          └────────┘                                            └──┘
src  ───┘   └────────┘└──────────────────────────────────────────┘    └───
typ  ───┘   └────────┘└──────────────────────────────────────────┘└──┘└───
doc  ───┘             └──────────────────────────────────────────┘    └───
txt  ───┘             └──────────────────────────────────────────┘    └───
par  ───┘             └──────────────────────────────────────────┘    └───
pid  ───┘             └──────────────────────────────────────────┘    └─┘
st   ─────────────────────────────────────────────────────────────────────
279  
src  
typ  
doc  
txt  
par  
pid  
st   
280    theorem pell_zd_succ_succ (n) : pell_zd (n + 2) + pell_zd n = (2 * a : ℕ) * pell_zd (n + 1) :=
id                                     └─────┘        └─────┘             └─────┘   
src  ─┘                                └─────┘         └─────┘               └─────┘    
typ  ─┘                                └─────┘        └─────┘             └─────┘   
doc  ─┘                                └─────┘           └─────┘                   └─────┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
281    have (1:ℤ√d) + ⟨a, 1⟩ * ⟨a, 1⟩ = ⟨a, 1⟩ * (2 * a),
id             └┘                            
src            └┘                              
typ            └┘                            
doc            └┘
282    by rw zsqrtd.coe_nat_val; change (⟨_,_⟩:ℤ√(d a1))=⟨_,_⟩;
id           └────────────────┘                    └┘  
src       └─┘└────────────────┘  └─────┘  └───┘     └┘ └──┘
typ       └─┘└────────────────┘  └─────┘  └───┘   └┘└┘ └──┘
doc       └─┘                    └─────┘  └───┘      └┘  └──┘
txt       └─┘                    └─────┘  └───┘      └┘  └──┘
par       └─┘                    └─────┘  └───┘      └┘  └──┘
pid                                     └───┘      └┘  └──┘
st       └──────────────────────────────────────────────────────
283       rw dz_val; change az a1 with a; simp [mul_add, add_mul],
id           └────┘         └┘ └┘              └─────┘  └─────┘
src       └─┘└────┘  └─────┘└┘  └────┘   └────┘└─────┘└┘└─────┘
typ       └─┘└────┘  └─────┘└┘└┘└────┘  └────┘└─────┘└┘└─────┘
doc       └─┘        └─────┘    └────┘   └────┘       └┘       
txt       └─┘        └─────┘    └────┘   └────┘       └┘       
par       └─┘        └─────┘    └────┘   └────┘       └┘       
pid                           └────┘              └┘       
st   ───────┘└────┘└────────────────────────────────────────────┘
284    by simpa [mul_add, mul_comm, mul_left_comm] using congr_arg (* pell_zd a1 n) this
id               └─────┘  └──────┘  └───────────┘        └───────┘   └─────┘ └┘   └──┘
src       └─────┘└─────┘└┘└──────┘└┘└───────────┘└──────┘└───────┘└┘└─────┘   └┘    
typ       └─────┘└─────┘└┘└──────┘└┘└───────────┘└──────┘└───────┘└┘└─────┘└┘└┘└──┘
doc       └─────┘       └┘        └┘             └──────┘          └┘└─────┘   └┘    
txt       └─────┘       └┘        └┘             └──────┘          └┘          └┘    
par       └─────┘       └┘        └┘             └──────┘          └┘          └┘    
pid                   └┘        └┘             └────┘          └┘          └┘    
st       └───────────────────────────────────────────────────────────────────────────────
285  
src  
typ  
doc  
txt  
par  
pid  
st   
286    theorem xy_succ_succ (n) : xn (n + 2) + xn n = (2 * a) * xn (n + 1) ∧
id                                └┘        └┘          └┘       
src  ─┘                           └┘         └┘            └┘        
typ  ─┘                           └┘        └┘          └┘       
doc  ─┘                           └┘           └┘               └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
287                               yn (n + 2) + yn n = (2 * a) * yn (n + 1) := begin
id                                └┘        └┘          └┘   
src                               └┘         └┘            └┘    
typ                               └┘        └┘          └┘   
doc                               └┘           └┘               └┘
st                                                                            └─────
288      have := pell_zd_succ_succ a1 n, unfold pell_zd at this,
id               └───────────────┘ └┘ 
src      └──────┘└───────────────┘     └────────────────────┘
typ      └──────┘└───────────────┘└┘  └────────────────────┘
doc      └──────┘                      └────────────────────┘
txt      └──────┘                      └────────────────────┘
par      └──────┘                      └────────────────────┘
pid      └───┘└─┘                            └──────┘└──────┘
st   ─────────────────────────────────┘└──────────────────────┘└─
289      rw [← int.cast_coe_nat, zsqrtd.smul_val] at this,
id             └──────────────┘  └─────────────┘
src      └────┘└──────────────┘└┘└─────────────┘└───────┘
typ      └────┘└──────────────┘└┘└─────────────┘└───────┘
doc      └────┘                └┘               └───────┘
txt      └────┘                └┘               └───────┘
par      └────┘                └┘               └───────┘
pid        └──┘                └┘               └──────┘
st   ─────────────────────────┘└───────────────┘└──────┘└─
290      injection this with h₁ h₂,
id                 └──┘
src      └────────┘    └─────────┘
typ      └────────┘└──┘└─────────┘
doc      └────────┘    └─────────┘
txt      └────────┘    └─────────┘
par      └────────┘    └─────────┘
pid                   └─────────┘
st   ────────────────────────────┘└─
291      split; apply int.coe_nat_inj; [simpa using h₁, simpa using h₂]
id                    └─────────────┘              └┘              └┘
src      └───┘  └────┘└─────────────┘  └──────────┘    └──────────┘
typ      └───┘  └────┘└─────────────┘  └──────────┘└┘  └──────────┘└┘
doc      └───┘  └────┘                  └──────────┘    └──────────┘
txt      └───┘  └────┘                  └──────────┘    └──────────┘
par      └───┘  └────┘                  └──────────┘    └──────────┘
pid                                         └────┘         └────┘
st   ─────────────────────────────────────────────────────────────────┘
292    end
st   ────┘
293  
294    theorem xn_succ_succ (n) : xn (n + 2) + xn n = (2 * a) * xn (n + 1) := (xy_succ_succ n).1
id                                └┘        └┘          └┘           └──────────┘  
src                               └┘         └┘            └┘            └──────────┘   
typ                               └┘        └┘          └┘           └──────────┘  
doc                               └┘           └┘               └┘
295    theorem yn_succ_succ (n) : yn (n + 2) + yn n = (2 * a) * yn (n + 1) := (xy_succ_succ n).2
id                                └┘        └┘          └┘           └──────────┘  
src                               └┘         └┘            └┘            └──────────┘   
typ                               └┘        └┘          └┘           └──────────┘  
doc                               └┘           └┘               └┘
296  
297    theorem xz_succ_succ (n) : xz (n + 2) = (2 * a : ℕ) * xz (n + 1) - xz n :=
id                                └┘                  └┘        └┘ 
src                               └┘                    └┘         └┘
typ                               └┘                  └┘        └┘ 
298    eq_sub_of_add_eq $ by delta xz; rw [← int.coe_nat_add, ← int.coe_nat_mul, xn_succ_succ]
id     └──────────────┘                      └─────────────┘    └─────────────┘  └──────────┘
src    └──────────────┘      └──────┘  └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
typ    └──────────────┘      └──────┘  └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
doc                          └──────┘  └────┘               └──┘               └┘            └─
txt                          └──────┘  └────┘               └──┘               └┘            └─
par                          └──────┘  └────┘               └──┘               └┘            └─
pid                               └─┘    └──┘               └──┘               └┘            
st                          └─────────────┘└───────────────┘└─────────────────┘└────────────┘
299  
src  
typ  
doc  
txt  
par  
pid  
st   
300    theorem yz_succ_succ (n) : yz (n + 2) = (2 * a : ℕ) * yz (n + 1) - yz n :=
id                                └┘                  └┘        └┘ 
src  ─┘                           └┘                    └┘         └┘
typ  ─┘                           └┘                  └┘        └┘ 
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
301    eq_sub_of_add_eq $ by delta yz; rw [← int.coe_nat_add, ← int.coe_nat_mul, yn_succ_succ]
id     └──────────────┘                      └─────────────┘    └─────────────┘  └──────────┘
src    └──────────────┘      └──────┘  └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
typ    └──────────────┘      └──────┘  └────┘└─────────────┘└──┘└─────────────┘└┘└──────────┘└─
doc                          └──────┘  └────┘               └──┘               └┘            └─
txt                          └──────┘  └────┘               └──┘               └┘            └─
par                          └──────┘  └────┘               └──┘               └┘            └─
pid                               └─┘    └──┘               └──┘               └┘            
st                          └─────────────┘└───────────────┘└─────────────────┘└────────────┘
302  
src  
typ  
doc  
txt  
par  
pid  
st   
303    theorem yn_modeq_a_sub_one : ∀ n, yn n ≡ n [MOD a-1]
id                                      └┘    └──┘  
src  ─┘                                  └┘      └──┘   
typ  ─┘                                 └┘    └──┘  
doc  ─┘                                  └┘      └──┘    
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
304    | 0 := by simp
src              └────
typ              └────
doc              └────
txt              └────
par              └────
pid                  
st              └─────
305    | 1 := by simp
src  ─┘          └────
typ  ─┘          └────
doc  ─┘          └────
txt  ─┘          └────
par  ─┘          └────
pid  ─┘              
st   ─┘         └─────
306    | (n+2) := modeq.modeq_add_cancel_right (yn_modeq_a_sub_one n) $
id              └──────────────────────────┘  └────────────────┘
src  ─┘          └──────────────────────────┘
typ  ─┘         └──────────────────────────┘  └────────────────┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
307      have 2*(n+1) = n+2+n, by simp [two_mul],
id                                 └─────┘
src                          └────┘└─────┘
typ                          └────┘└─────┘
doc                               └────┘       
txt                               └────┘       
par                               └────┘       
pid                                          
st                               └─────────────┘
308      by rw [yn_succ_succ, ← this];
id              └──────────┘    └──┘
src         └──┘└──────────┘└──┘    
typ         └──┘└──────────┘└──┘└──┘
doc         └──┘            └──┘    
txt         └──┘            └──┘    
par         └──┘            └──┘    
pid           └┘            └──┘    
st         └───────────────┘└──────┘└─
309      refine modeq.modeq_mul (modeq.modeq_mul_left 2 (_ : a ≡ 1 [MOD a-1])) (yn_modeq_a_sub_one (n+1));
id              └─────────────┘  └──────────────────┘                         └────────────────┘  
src      └─────┘└─────────────┘ └──────────────────┘└─┘ └──┘  └─┘      └─┘                     └─┘
typ      └─────┘└─────────────┘ └──────────────────┘└─┘ └──┘ └─┘      └─┘ └────────────────┘ └─┘
doc      └─────┘                                    └─┘ └──┘  └─┘       └─┘                      └─┘
txt      └─────┘                                    └─┘ └──┘  └─┘       └─┘                      └─┘
par      └─────┘                                    └─┘ └──┘  └─┘       └─┘                      └─┘
pid                                                └─┘ └──┘  └─┘       └─┘                      └─┘
st   ──────────────────────────────────────────────────────────────────────────────────────────────────────
310      exact (modeq.modeq_of_dvd $ by rw [int.coe_nat_sub $ le_of_lt a1]; apply dvd_refl).symm
id              └────────────────┘          └─────────────┘   └──────┘ └┘
src      └────┘ └────────────────┘   └──┘└─────────────┘ └──────┘  └┘└────┘        └──────
typ      └────┘ └────────────────┘   └──┘└─────────────┘ └──────┘└┘└──────┘        └──────
doc      └────┘                      └──┘                          └┘└────┘        └──────
txt      └────┘                      └──┘                          └┘└────┘        └──────
par      └────┘                      └──┘                          └──────┘        └──────
pid                                 └───┘                          └───────┘        └───┘└─
st   ─────────────────────────────────┘└────────────────────────────────┘└──────────────┘└──────
311  
src  
typ  
doc  
txt  
par  
pid  
st   
312    theorem yn_modeq_two : ∀ n, yn n ≡ n [MOD 2]
id                                └┘    └──┘  
src  ─┘                            └┘      └──┘  
typ  ─┘                           └┘    └──┘  
doc  ─┘                            └┘      └──┘  
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
313    | 0 := by simp
src              └────
typ              └────
doc              └────
txt              └────
par              └────
pid                  
st              └─────
314    | 1 := by simp
src  ─┘          └────
typ  ─┘          └────
doc  ─┘          └────
txt  ─┘          └────
par  ─┘          └────
pid  ─┘              
st   ─┘         └─────
315    | (n+2) := modeq.modeq_add_cancel_right (yn_modeq_two n) $
id              └──────────────────────────┘  └──────────┘
src  ─┘          └──────────────────────────┘
typ  ─┘         └──────────────────────────┘  └──────────┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
316      have 2*(n+1) = n+2+n, by simp [two_mul],
id                                 └─────┘
src                          └────┘└─────┘
typ                          └────┘└─────┘
doc                               └────┘       
txt                               └────┘       
par                               └────┘       
pid                                          
st                               └─────────────┘
317      by rw [yn_succ_succ, ← this];
id              └──────────┘    └──┘
src         └──┘└──────────┘└──┘    
typ         └──┘└──────────┘└──┘└──┘
doc         └──┘            └──┘    
txt         └──┘            └──┘    
par         └──┘            └──┘    
pid           └┘            └──┘    
st         └───────────────┘└──────┘└─
318      refine modeq.modeq_mul _ (yn_modeq_two (n+1));
id              └─────────────┘    └──────────┘  
src      └─────┘└─────────────┘└─┘               └─┘
typ      └─────┘└─────────────┘└─┘ └──────────┘ └─┘
doc      └─────┘               └─┘                └─┘
txt      └─────┘               └─┘                └─┘
par      └─────┘               └─┘                └─┘
pid                           └─┘                └─┘
st   ───────────────────────────────────────────────────
319      exact modeq.trans
id             └─────────┘
src      └────┘└─────────┘
typ      └────┘└─────────┘
doc      └────┘           
txt      └────┘           
par      └────┘           
pid                      
st   ──────────────────────
320        (modeq.modeq_zero_iff.2 $ by simp)
src  ─────┘                     └─┘   └──┘└─
typ  ─────┘                     └─┘   └──┘└─
doc  ─────┘                     └─┘   └──┘└─
txt  ─────┘                     └─┘   └──┘└─
par  ─────┘                     └─┘   └──┘└─
pid  ─────┘                     └─┘   └──────
st   ─────────────────────────────────┘└───┘└─
321        (modeq.modeq_zero_iff.2 $ by simp).symm
id          └──────────────────┘
src  ─────┘ └──────────────────┘└─┘   └──┘└──────
typ  ─────┘ └──────────────────┘└─┘   └──┘└──────
doc  ─────┘                     └─┘   └──┘└──────
txt  ─────┘                     └─┘   └──┘└──────
par  ─────┘                     └─┘   └──┘└──────
pid  ─────┘                     └─┘   └────────┘└─
st   ─────────────────────────────────┘└───┘└──────
322  
src  
typ  
doc  
txt  
par  
pid  
st   
323    lemma x_sub_y_dvd_pow_lem (y2 y1 y0 yn1 yn0 xn1 xn0 ay a2 : ℤ) :
id                                                                 
src  ─┘                                                            
typ  ─┘                                                            
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
324      (a2 * yn1 - yn0) * ay + y2 - (a2 * xn1 - xn0) =
id        └┘  └─┘  └─┘   └┘  └┘   └┘  └─┘  └─┘  
src                                             
typ       └┘  └─┘  └─┘   └┘  └┘   └┘  └─┘  └─┘  
325        y2 - a2 * y1 + y0 + a2 * (yn1 * ay + y1 - xn1) - (yn0 * ay + y0 - xn0) := by ring
id         └┘  └┘  └┘  └┘  └┘   └─┘  └┘  └┘  └─┘    └─┘  └┘  └┘  └─┘
src                                                                         └────
typ        └┘  └┘  └┘  └┘  └┘   └─┘  └┘  └┘  └─┘    └─┘  └┘  └┘  └─┘        └────
doc                                                                                     └────
txt                                                                                     └────
par                                                                                     └────
pid                                                                                         
st                                                                                     └─────
326  
src  
typ  
doc  
txt  
par  
pid  
st   
327    theorem x_sub_y_dvd_pow (y : ℕ) :
id                                  
src  ─┘                             
typ  ─┘                             
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
328      ∀ n, (2*a*y - y*y - 1 : ℤ) ∣ yz n * (a - y) + ↑(y^n) - xz n
id                        └┘             └┘ 
src                            └┘                  └┘
typ                       └┘             └┘ 
329    | 0 := by simp [xz, yz, int.coe_nat_zero, int.coe_nat_one]
id                     └┘  └┘  └──────────────┘  └─────────────┘
src              └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
typ              └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
doc              └────┘  └┘  └┘                └┘               └─
txt              └────┘  └┘  └┘                └┘               └─
par              └────┘  └┘  └┘                └┘               └─
pid                    └┘  └┘                └┘               
st              └─────────────────────────────────────────────────
330    | 1 := by simp [xz, yz, int.coe_nat_zero, int.coe_nat_one]
id                     └┘  └┘  └──────────────┘  └─────────────┘
src  ─┘          └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
typ  ─┘          └────┘└┘└┘└┘└┘└──────────────┘└┘└─────────────┘└─
doc  ─┘          └────┘  └┘  └┘                └┘               └─
txt  ─┘          └────┘  └┘  └┘                └┘               └─
par  ─┘          └────┘  └┘  └┘                └┘               └─
pid  ─┘                └┘  └┘                └┘               
st   ─┘         └─────────────────────────────────────────────────
331    | (n+2) :=
id        
src  ─┘    
typ  ─┘   
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
332      have (2*a*y - y*y - 1 : ℤ) ∣ ↑(y^(n + 2)) - ↑(2 * a) * ↑(y^(n + 1)) + ↑(y^n), from
id                                                     
src                                                            
typ                                                    
333      ⟨-↑(y^n), by simp [nat.pow_succ, mul_add, int.coe_nat_mul,
id                      └──────────┘  └─────┘  └─────────────┘
src                └────┘└──────────┘└┘└─────┘└┘└─────────────┘└─
typ               └────┘└──────────┘└┘└─────┘└┘└─────────────┘└─
doc                   └────┘            └┘       └┘               └─
txt                   └────┘            └┘       └┘               └─
par                   └────┘            └┘       └┘               └─
pid                                   └┘       └┘               └─
st                   └──────────────────────────────────────────────
334          show ((2:ℕ):ℤ) = 2, from rfl, mul_comm, mul_left_comm]⟩,
id                                   └─┘  └──────┘  └───────────┘
src  ───────┘      └┘ └┘ └┘└───────┘└─┘└┘└──────┘└┘└───────────┘
typ  ───────┘      └┘ └┘ └┘└───────┘└─┘└┘└──────┘└┘└───────────┘
doc  ───────┘      └┘ └┘ └┘ └───────┘   └┘        └┘             
txt  ───────┘      └┘ └┘ └┘ └───────┘   └┘        └┘             
par  ───────┘      └┘ └┘ └┘ └───────┘   └┘        └┘             
pid  ───────┘      └┘ └┘ └┘ └───────┘   └┘        └┘             
st   ─────────────────────────────────────────────────────────────┘
335      by rw [xz_succ_succ, yz_succ_succ, x_sub_y_dvd_pow_lem a1 ↑(y^(n+2)) ↑(y^(n+1)) ↑(y^n)]; exact
id              └──────────┘  └──────────┘  └─────────────────┘ └┘                       
src         └──┘└──────────┘└┘└──────────┘└┘└─────────────────┘      └──┘       └──┘     └┘  └─────
typ         └──┘└──────────┘└┘└──────────┘└┘└─────────────────┘└┘    └──┘       └──┘   └┘  └─────
doc         └──┘            └┘            └┘                            └──┘       └──┘     └┘  └─────
txt         └──┘            └┘            └┘                            └──┘       └──┘     └┘  └─────
par         └──┘            └┘            └┘                            └──┘       └──┘     └┘  └─────
pid           └┘            └┘            └┘                            └──┘       └──┘     └┘       
st         └───────────────┘└────────────┘└───────────────────────────────────────────────────┘└───────
336      dvd_sub (dvd_add this $ dvd_mul_of_dvd_right (x_sub_y_dvd_pow (n+1)) _) (x_sub_y_dvd_pow n)
id       └─────┘  └─────┘ └──┘   └──────────────────┘                             └─────────────┘ 
src  ───┘└─────┘ └─────┘     └──────────────────┘                   └─────┘                 └─
typ  ───┘└─────┘ └─────┘└──┘ └──────────────────┘                   └─────┘ └─────────────┘└─
doc  ───┘                                                           └─────┘                 └─
txt  ───┘                                                           └─────┘                 └─
par  ───┘                                                           └─────┘                 └─
pid  ───┘                                                           └─────┘                 
st   ────────────────────────────────────────────────────────────────────────────────────────────────
337  
src  
typ  
doc  
txt  
par  
pid  
st   
338    theorem xn_modeq_x2n_add_lem (n j) : xn n ∣ d * yn n * (yn n * xn j) + xn j :=
id                                          └┘     └┘    └┘   └┘    └┘ 
src  ─┘                                     └┘      └┘     └┘    └┘     └┘
typ  ─┘                                     └┘     └┘    └┘   └┘    └┘ 
doc  ─┘                                     └┘         └┘      └┘     └┘      └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
339    have h1 : d * yn n * (yn n * xn j) + xn j = (d * yn n * yn n + 1) * xn j,
id                 └┘    └┘   └┘    └┘      └┘   └┘       └┘ 
src                └┘     └┘    └┘     └┘       └┘    └┘        └┘
typ                └┘    └┘   └┘    └┘      └┘   └┘       └┘ 
doc                  └┘      └┘     └┘      └┘          └┘     └┘          └┘
340      by simp [add_mul, mul_assoc],
id                └─────┘  └───────┘
src         └────┘└─────┘└┘└───────┘
typ         └────┘└─────┘└┘└───────┘
doc         └────┘       └┘         
txt         └────┘       └┘         
par         └────┘       └┘         
pid                    └┘         
st         └────────────────────────┘
341    have h2 : d * yn n * yn n + 1 = xn n * xn n, by apply int.coe_nat_inj;
id                 └┘   └┘      └┘   └┘            └─────────────┘
src                └┘    └┘       └┘    └┘       └────┘└─────────────┘
typ                └┘   └┘      └┘   └┘      └────┘└─────────────┘
doc                  └┘     └┘         └┘     └┘       └────┘
txt                                                    └────┘
par                                                    └────┘
pid                                                         
st                                                    └───────────────────────
342      repeat {rw int.coe_nat_add <|> rw int.coe_nat_mul}; exact
id                  └─────────────┘        └─────────────┘
src      └──────┘└─┘└─────────────┘└──┘└─┘└─────────────┘  └─────
typ      └──────┘└─┘└─────────────┘└──┘└─┘└─────────────┘  └─────
doc      └──────┘└─┘               └──┘└─┘                 └─────
txt      └──────┘└─┘               └──┘└─┘                 └─────
par      └──────┘└─┘               └──┘└─┘                 └─────
pid            └───┘               └──────┘                      
st   ───────────┘└────────────────────────┘└───────────────┘└──────
343      add_eq_of_eq_sub' (eq.symm $ pell_eqz _ _),
id       └───────────────┘  └─────┘   └──────┘
src  ───┘└───────────────┘ └─────┘ └──────┘└───┘
typ  ───┘└───────────────┘ └─────┘ └──────┘└───┘
doc  ───┘                                  └───┘
txt  ───┘                                  └───┘
par  ───┘                                  └───┘
pid  ───┘                                  └───┘
st   ─────────────────────────────────────────────┘
344    by rw h2 at h1; rw [h1, mul_assoc]; exact dvd_mul_right _ _
id           └┘            └┘  └───────┘         └───────────┘
src       └─┘  └────┘  └──┘  └┘└───────┘  └────┘└───────────┘└────
typ       └─┘└┘└────┘  └──┘└┘└┘└───────┘  └────┘└───────────┘└────
doc       └─┘  └────┘  └──┘  └┘           └────┘             └────
txt       └─┘  └────┘  └──┘  └┘           └────┘             └────
par       └─┘  └────┘  └──┘  └┘           └────┘             └────
pid           └────┘    └┘  └┘                             └──┘
st       └────────────────┘└┘└─────────┘└─────────────────────────
345  
src  
typ  
doc  
txt  
par  
pid  
st   
346    theorem xn_modeq_x2n_add (n j) : xn (2 * n + j) + xn j ≡ 0 [MOD xn n] :=
id                                      └┘          └┘     └──┘ └┘ 
src  ─┘                                 └┘            └┘      └──┘ └┘  
typ  ─┘                                 └┘          └┘     └──┘ └┘ 
doc  ─┘                                 └┘               └┘      └──┘ └┘  
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
347    by rw [two_mul, add_assoc, xn_add, add_assoc]; exact
id            └─────┘  └───────┘  └────┘  └───────┘
src       └──┘└─────┘└┘└───────┘└┘└────┘└┘└───────┘  └─────
typ       └──┘└─────┘└┘└───────┘└┘└────┘└┘└───────┘  └─────
doc       └──┘       └┘         └┘      └┘           └─────
txt       └──┘       └┘         └┘      └┘           └─────
par       └──┘       └┘         └┘      └┘           └─────
pid         └┘       └┘         └┘      └┘                
st       └──────────┘└─────────┘└──────┘└─────────┘└───────
348    show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_right (xn a1 n) (xn a1 (n + j))) $
id                └──┘               └─────────────┘  └──────────────────┘     └───────────┘            └┘ └┘     
src  ─┘    └─┘ └┘└┘          └─────┘└─────────────┘ └──────────────────┘└─┘ └───────────┘      └┘ └┘      └──┘ 
typ  ─┘    └─┘└┘└┘└──┘     └─────┘└─────────────┘ └──────────────────┘└─┘ └───────────┘      └┘ └┘└┘  └──┘ 
doc  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                    └┘ └┘      └──┘ 
txt  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                    └┘         └──┘ 
par  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                    └┘         └──┘ 
pid  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                    └┘         └──┘ 
st   ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
349    by rw [yn_add, left_distrib, add_assoc]; exact
id            └────┘  └──────────┘  └───────┘
src  ─┘  └──┘└────┘└┘└──────────┘└┘└───────┘└───────
typ  ─┘  └──┘└────┘└┘└──────────┘└┘└───────┘└───────
doc  ─┘  └──┘      └┘            └┘         └───────
txt  ─┘  └──┘      └┘            └┘         └───────
par  ─┘  └──┘      └┘            └┘         └───────
pid  ─┘  └───┘      └┘            └┘         └────────
st   ───┘└─────────┘└────────────┘└─────────┘└───────
350    show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_of_dvd_right (dvd_mul_right _ _) _) $
id                 └──┘ └┘ └┘        └─────────────┘                           └──────────────────┘  └───────────┘
src  ─┘    └─┘ └┘ └┘    └┘    └─────┘└─────────────┘                     └─┘ └──────────────────┘ └───────────┘└───────┘ 
typ  ─┘    └─┘└┘ └┘└──┘└┘└┘└─────┘└─────────────┘                     └─┘ └──────────────────┘ └───────────┘└───────┘ 
doc  ─┘    └─┘ └┘ └┘    └┘    └─────┘                                    └─┘                                   └───────┘ 
txt  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                                   └───────┘ 
par  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                                   └───────┘ 
pid  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘                                   └───────┘ 
st   ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
351    modeq.modeq_zero_iff.2 $ xn_modeq_x2n_add_lem _ _ _
id     └──────────────────┘     └──────────────────┘
src  ─┘└──────────────────┘└─┘ └──────────────────┘└──────
typ  ─┘└──────────────────┘└─┘ └──────────────────┘└──────
doc  ─┘                    └─┘                     └──────
txt  ─┘                    └─┘                     └──────
par  ─┘                    └─┘                     └──────
pid  ─┘                    └─┘                     └──────
st   ──────────────────────────────────────────────────────
352  
src  
typ  
doc  
txt  
par  
pid  
st   
353    lemma xn_modeq_x2n_sub_lem {n j} (h : j ≤ n) : xn (2 * n - j) + xn j ≡ 0 [MOD xn n] :=
id                                                 └┘          └┘     └──┘ └┘ 
src  ─┘                                              └┘            └┘      └──┘ └┘  
typ  ─┘                                            └┘          └┘     └──┘ └┘ 
doc  ─┘                                               └┘               └┘      └──┘ └┘  
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
354    have h1 : xz n ∣ ↑d * yz n * yz (n - j) + xz j, by rw [yz_sub _ h, mul_sub_left_distrib, sub_add_eq_add_sub]; exact
id               └┘     └┘   └┘       └┘          └────┘     └──────────────────┘  └────────────────┘
src              └┘      └┘    └┘         └┘       └──┘└────┘└─┘ └┘└──────────────────┘└┘└────────────────┘  └─────
typ              └┘     └┘   └┘       └┘      └──┘└────┘└─┘└┘└──────────────────┘└┘└────────────────┘  └─────
doc                                                       └──┘      └─┘ └┘                    └┘                    └─────
txt                                                       └──┘      └─┘ └┘                    └┘                    └─────
par                                                       └──┘      └─┘ └┘                    └┘                    └─────
pid                                                         └┘      └─┘ └┘                    └┘                         
st                                                       └─────────────┘└────────────────────┘└──────────────────┘└───────
355    dvd_sub
id     └─────┘
src  ─┘└─────┘
typ  ─┘└─────┘
doc  ─┘       
txt  ─┘       
par  ─┘       
pid  ─┘       
st   ──────────
356      (by delta xz; delta yz;
src  ───┘   └──────┘└┘└──────┘└─
typ  ───┘   └──────┘└┘└──────┘└─
doc  ───┘   └──────┘└┘└──────┘└─
txt  ───┘   └──────┘└┘└──────┘└─
par  ───┘   └──────┘└┘└──────┘└─
pid  ───┘   └────────────────────
st   ──────┘└────────────────────
357          repeat {rw ← int.coe_nat_add <|> rw ← int.coe_nat_mul}; rw mul_comm (xn a1 j) (yn a1 n);
id                        └─────────────┘          └─────────────┘      └──────┘  └┘       └┘ └┘ 
src  ───────┘└──────┘└───┘└─────────────┘└──┘└───┘└─────────────┘└┘└─┘└──────┘ └┘   └┘ └┘   └─
typ  ───────┘└──────┘└───┘└─────────────┘└──┘└───┘└─────────────┘└┘└─┘└──────┘ └┘  └┘ └┘└┘└─
doc  ───────┘└──────┘└───┘               └──┘└───┘               └┘└─┘         └┘   └┘ └┘   └─
txt  ───────┘└──────┘└───┘               └──┘└───┘               └┘└─┘              └┘      └─
par  ───────┘└──────┘└───┘               └──┘└───┘               └┘└─┘              └┘      └─
pid  ────────────────────┘               └────────┘               └────┘              └┘      └──
st   ───────────────┘└───────────────────────────────────────────┘└───┘└──────┘└─────────────────────
358          exact int.coe_nat_dvd.2 (xn_modeq_x2n_add_lem _ _ _))
id                 └─────────────┘    └──────────────────┘
src  ─────────────┘└─────────────┘└─┘ └──────────────────┘└────────
typ  ─────────────┘└─────────────┘└─┘ └──────────────────┘└────────
doc  ─────────────┘               └─┘                     └────────
txt  ─────────────┘               └─┘                     └────────
par  ─────────────┘               └─┘                     └────────
pid  ─────────────┘               └─┘                     └────────
st   ───────────────────────────────────────────────────────────┘└─
359      (dvd_mul_of_dvd_right (dvd_mul_right _ _) _),
id        └──────────────────┘  └───────────┘
src  ───┘ └──────────────────┘ └───────────┘└──────┘
typ  ───┘ └──────────────────┘ └───────────┘└──────┘
doc  ───┘                                   └──────┘
txt  ───┘                                   └──────┘
par  ───┘                                   └──────┘
pid  ───┘                                   └──────┘
st   ───────────────────────────────────────────────┘
360    by rw [two_mul, nat.add_sub_assoc h, xn_add, add_assoc]; exact
id            └─────┘  └───────────────┘   └────┘  └───────┘
src       └──┘└─────┘└┘└───────────────┘ └┘└────┘└┘└───────┘  └─────
typ       └──┘└─────┘└┘└───────────────┘└┘└────┘└┘└───────┘  └─────
doc       └──┘       └┘                  └┘      └┘           └─────
txt       └──┘       └┘                  └┘      └┘           └─────
par       └──┘       └┘                  └┘      └┘           └─────
pid         └┘       └┘                  └┘      └┘                
st       └──────────┘└───────────────────┘└──────┘└─────────┘└───────
361    show _ ≡ 0+0 [MOD xn a1 n], from modeq.modeq_add (modeq.modeq_zero_iff.2 $ dvd_mul_right _ _) $
id                └──┘ └┘ └┘        └─────────────┘                           └───────────┘
src  ─┘    └─┘ └┘└┘    └┘    └─────┘└─────────────┘                     └─┘ └───────────┘└────┘ 
typ  ─┘    └─┘└┘└┘└──┘└┘└┘└─────┘└─────────────┘                     └─┘ └───────────┘└────┘ 
doc  ─┘    └─┘ └┘ └┘    └┘    └─────┘                                    └─┘              └────┘ 
txt  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘              └────┘ 
par  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘              └────┘ 
pid  ─┘    └─┘ └┘ └┘          └─────┘                                    └─┘              └────┘ 
st   ──────────────────────────────────────────────────────────────────────────────────────────────────
362    modeq.modeq_zero_iff.2 $ int.coe_nat_dvd.1 $ by simpa [xz, yz] using h1
id     └──────────────────┘     └─────────────┘               └┘  └┘        └┘
src  ─┘└──────────────────┘└─┘ └─────────────┘└─┘   └─────┘└┘└┘└┘└──────┘  
typ  ─┘└──────────────────┘└─┘ └─────────────┘└─┘   └─────┘└┘└┘└┘└──────┘└┘
doc  ─┘                    └─┘                └─┘   └─────┘  └┘  └──────┘  
txt  ─┘                    └─┘                └─┘   └─────┘  └┘  └──────┘  
par  ─┘                    └─┘                └─┘   └─────┘  └┘  └──────┘  
pid  ─┘                    └─┘                └─┘   └──────┘  └┘  └──────┘  
st   ────────────────────────────────────────────────┘└────────────────────────
363  
src  
typ  
doc  
txt  
par  
pid  
st   
364    theorem xn_modeq_x2n_sub {n j} (h : j ≤ 2 * n) : xn (2 * n - j) + xn j ≡ 0 [MOD xn n] :=
id                                                  └┘          └┘     └──┘ └┘ 
src  ─┘                                               └┘            └┘      └──┘ └┘  
typ  ─┘                                             └┘          └┘     └──┘ └┘ 
doc  ─┘                                                 └┘               └┘      └──┘ └┘  
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
365    (le_total j n).elim xn_modeq_x2n_sub_lem
id      └──────┘   └──┘  └──────────────────┘
src     └──────┘     └──┘  └──────────────────┘
typ     └──────┘   └──┘  └──────────────────┘
366      (λjn, have 2 * n - j + j ≤ n + j, by rw [nat.sub_add_cancel h, two_mul]; exact nat.add_le_add_left jn _,
id         └┘                           └────────────────┘   └─────┘         └─────────────────┘ └┘
src                                      └──┘└────────────────┘ └┘└─────┘  └────┘└─────────────────┘  └┘
typ        └┘                       └──┘└────────────────┘└┘└─────┘  └────┘└─────────────────┘└┘└┘
doc                                           └──┘                   └┘         └────┘                     └┘
txt                                           └──┘                   └┘         └────┘                     └┘
par                                           └──┘                   └┘         └────┘                     └┘
pid                                             └┘                   └┘                                   └┘
st                                           └───────────────────────┘└───────┘└──────────────────────────────┘
367        let t := xn_modeq_x2n_sub_lem (nat.le_of_add_le_add_right this) in by rwa [nat.sub_sub_self h, add_comm] at t)
id                 └──────────────────┘  └────────────────────────┘ └──┘             └──────────────┘   └──────┘
src                 └──────────────────┘  └────────────────────────┘             └───┘└──────────────┘ └┘└──────┘└────┘
typ                └──────────────────┘  └────────────────────────┘ └──┘        └───┘└──────────────┘└┘└──────┘└────┘
doc                                                                              └───┘                 └┘        └────┘
txt                                                                              └───┘                 └┘        └────┘
par                                                                              └───┘                 └┘        └────┘
pid                                                                                 └┘                 └┘        └───┘
st                                                                              └──────────────────────┘└────────┘└───┘
368  
369    theorem xn_modeq_x4n_add (n j) : xn (4 * n + j) ≡ xn j [MOD xn n] :=
id                                      └┘          └┘  └──┘ └┘ 
src                                     └┘            └┘   └──┘ └┘  
typ                                     └┘          └┘  └──┘ └┘ 
doc                                     └┘              └┘   └──┘ └┘  
370    modeq.modeq_add_cancel_right (modeq.refl $ xn (2 * n + j)) $
id     └──────────────────────────┘  └────────┘   └┘       
src    └──────────────────────────┘  └────────┘   └┘       
typ    └──────────────────────────┘  └────────┘   └┘       
doc                                               └┘
371    by refine @modeq.trans _ _ 0 _ _ (by rw add_comm; exact (xn_modeq_x2n_add _ _ _).symm);
id                └─────────┘                  └──────┘         └──────────────┘
src       └─────┘ └─────────┘└─────────┘   └─┘└──────┘└┘└────┘ └──────────────┘└──────────┘
typ       └─────┘ └─────────┘└─────────┘   └─┘└──────┘└──────┘ └──────────────┘└───────────┘
doc       └─────┘            └─────────┘   └─┘        └┘└────┘                 └──────────┘
txt       └─────┘            └─────────┘   └─┘        └┘└────┘                 └──────────┘
par       └─────┘            └─────────┘   └─┘        └──────┘                 └───────────┘
pid                         └─────────┘   └──┘        └──────┘                 └───────────┘
st       └────────────────────────────────┘└───────────────────────────────────────────────┘└──
372       rw [show 4*n = 2*n + 2*n, from right_distrib 2 2 n, add_assoc]; apply xn_modeq_x2n_add
id                                    └───────────┘       └───────┘         └──────────────┘
src       └──┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘ └┘└───────┘  └────┘└──────────────┘
typ       └──┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘└┘└───────┘  └────┘└──────────────┘
doc       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘           └────┘                
txt       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘           └────┘                
par       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘           └────┘                
pid         └┘    └┘   └┘   └┘  └─────┘             └───┘ └┘                                
st   ────────┘└────────────────────────────────────────────┘└─────────┘└────────────────────────
373  
src  
typ  
doc  
txt  
par  
pid  
st   
374    theorem xn_modeq_x4n_sub {n j} (h : j ≤ 2 * n) : xn (4 * n - j) ≡ xn j [MOD xn n] :=
id                                                  └┘          └┘  └──┘ └┘ 
src  ─┘                                               └┘            └┘   └──┘ └┘  
typ  ─┘                                             └┘          └┘  └──┘ └┘ 
doc  ─┘                                                 └┘              └┘   └──┘ └┘  
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
375    have h' : j ≤ 2*n, from le_trans h (by rw nat.succ_mul; apply nat.le_add_left),
id                         └──────┘         └──────────┘
src                          └──────┘       └─┘└──────────┘  └────┘
typ                        └──────┘      └─┘└──────────┘  └────┘
doc                                           └─┘              └────┘
txt                                           └─┘              └────┘
par                                           └─┘              └────┘
pid                                                                
st                                           └─────────────────────────────────────┘
376    modeq.modeq_add_cancel_right (modeq.refl $ xn (2 * n - j)) $
id     └──────────────────────────┘  └────────┘   └┘       
src    └──────────────────────────┘  └────────┘   └┘       
typ    └──────────────────────────┘  └────────┘   └┘       
doc                                               └┘
377    by refine @modeq.trans _ _ 0 _ _ (by rw add_comm; exact (xn_modeq_x2n_sub _ h).symm);
id                └─────────┘                  └──────┘         └──────────────┘   
src       └─────┘ └─────────┘└─────────┘   └─┘└──────┘└┘└────┘ └──────────────┘└─┘ └────┘
typ       └─────┘ └─────────┘└─────────┘   └─┘└──────┘└──────┘ └──────────────┘└─┘└─────┘
doc       └─────┘            └─────────┘   └─┘        └┘└────┘                 └─┘ └────┘
txt       └─────┘            └─────────┘   └─┘        └┘└────┘                 └─┘ └────┘
par       └─────┘            └─────────┘   └─┘        └──────┘                 └─┘ └─────┘
pid                         └─────────┘   └──┘        └──────┘                 └─┘ └─────┘
st       └────────────────────────────────┘└─────────────────────────────────────────────┘└──
378       rw [show 4*n = 2*n + 2*n, from right_distrib 2 2 n, nat.add_sub_assoc h']; apply xn_modeq_x2n_add
id                                    └───────────┘       └───────────────┘ └┘         └──────────────┘
src       └──┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘ └┘└───────────────┘    └────┘└──────────────┘
typ       └──┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘└┘└───────────────┘└┘  └────┘└──────────────┘
doc       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘                     └────┘                
txt       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘                     └────┘                
par       └──┘    └┘   └┘   └┘  └─────┘             └───┘ └┘                     └────┘                
pid         └┘    └┘   └┘   └┘  └─────┘             └───┘ └┘                                          
st   ────────┘└────────────────────────────────────────────┘└────────────────────┘└────────────────────────
379  
src  
typ  
doc  
txt  
par  
pid  
st   
380    theorem eq_of_xn_modeq_lem1 {i n} : Π {j}, i < j → j < n → xn i % xn n < xn j % xn n
id                                                        └┘   └┘   └┘   └┘ 
src  ─┘                                                         └┘    └┘    └┘    └┘
typ  ─┘                                                   └┘   └┘   └┘   └┘ 
doc  ─┘                                                           └┘     └┘     └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
381    | 0     ij _  := absurd ij (nat.not_lt_zero _)
id             └┘       └────┘     └─────────────┘
src                     └────┘     └─────────────┘
typ            └┘       └────┘     └─────────────┘
382    | (j+1) ij jn :=
id           └┘ └┘
src        
typ          └┘ └┘
383       suffices xn j % xn n < xn (j + 1) % xn n, from
id                 └┘    └┘   └┘         └┘ 
src                └┘    └┘    └┘         └┘
typ                └┘    └┘   └┘         └┘ 
doc                └┘     └┘     └┘           └┘
384       (lt_or_eq_of_le (nat.le_of_succ_le_succ ij)).elim
id         └────────────┘  └────────────────────┘     └──┘
src        └────────────┘  └────────────────────┘     └──┘
typ        └────────────┘  └────────────────────┘     └──┘
385          (λh, lt_trans (eq_of_xn_modeq_lem1 h (le_of_lt jn)) this)
id               └──────┘  └─────────────────┘   └──────┘      └──┘
src               └──────┘                         └──────┘
typ              └──────┘  └─────────────────┘   └──────┘      └──┘
386          (λh, by rw h; exact this),
id                             └──┘
src                  └─┘   └────┘
typ                 └─┘  └────┘└──┘
doc                  └─┘   └────┘
txt                  └─┘   └────┘
par                  └─┘   └────┘
pid                            
st                  └───────────────┘
387      by rw [nat.mod_eq_of_lt (x_increasing _ (nat.lt_of_succ_lt jn)), nat.mod_eq_of_lt (x_increasing _ jn)];
id              └──────────────┘  └──────────┘    └───────────────┘ └┘    └──────────────┘  └──────────┘   └┘
src         └──┘└──────────────┘ └──────────┘└─┘ └───────────────┘  └──┘└──────────────┘ └──────────┘└─┘  └┘
typ         └──┘└──────────────┘ └──────────┘└─┘ └───────────────┘└┘└──┘└──────────────┘ └──────────┘└─┘└┘└┘
doc         └──┘                             └─┘                    └──┘                             └─┘  └┘
txt         └──┘                             └─┘                    └──┘                             └─┘  └┘
par         └──┘                             └─┘                    └──┘                             └─┘  └┘
pid           └┘                             └─┘                    └──┘                             └─┘  └┘
st         └───────────────────────────────────────────────────────────┘└────────────────────────────────────┘└─
388         exact x_increasing _ (nat.lt_succ_self _)
id                └──────────┘    └──────────────┘
src         └────┘└──────────┘└─┘ └──────────────┘└───
typ         └────┘└──────────┘└─┘ └──────────────┘└───
doc         └────┘            └─┘                 └───
txt         └────┘            └─┘                 └───
par         └────┘            └─┘                 └───
pid                          └─┘                 └─┘
st   ─────────────────────────────────────────────────
389  
src  
typ  
doc  
txt  
par  
pid  
st   
390    theorem eq_of_xn_modeq_lem2 {n} (h : 2 * xn n = xn (n + 1)) : a = 2 ∧ n = 0 :=
id                                             └┘   └┘                
src  ─┘                                        └┘    └┘                   
typ  ─┘                                        └┘   └┘                
doc  ─┘                                         └┘     └┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
391    by rw [xn_succ, mul_comm] at h; exact
id            └─────┘  └──────┘
src       └──┘└─────┘└┘└──────┘└────┘  └─────
typ       └──┘└─────┘└┘└──────┘└────┘  └─────
doc       └──┘       └┘        └────┘  └─────
txt       └──┘       └┘        └────┘  └─────
par       └──┘       └┘        └────┘  └─────
pid         └┘       └┘        └───┘       
st       └──────────┘└────────┘└────────────
392    have n = 0, from n.eq_zero_or_pos.resolve_right $ λnp,
id                     └────────────────────────────┘
src  ─┘    └─┘└───────┘└────────────────────────────┘  └───
typ  ─┘    └─┘└───────┘└────────────────────────────┘  └───
doc  ─┘    └─┘ └───────┘                                └───
txt  ─┘    └─┘ └───────┘                                └───
par  ─┘    └─┘ └───────┘                                └───
pid  ─┘    └─┘ └───────┘                                └───
st   ─────────────────────────────────────────────────────────
393      ne_of_lt (lt_of_le_of_lt (nat.mul_le_mul_left _ a1)
id       └──────┘  └────────────┘  └─────────────────┘
src  ───┘└──────┘ └────────────┘ └─────────────────┘└─┘  └─
typ  ───┘└──────┘ └────────────┘ └─────────────────┘└─┘  └─
doc  ───┘                                           └─┘  └─
txt  ───┘                                           └─┘  └─
par  ───┘                                           └─┘  └─
pid  ───┘                                           └─┘  └─
st   ────────────────────────────────────────────────────────
394        (nat.lt_add_of_pos_right $ mul_pos (d_pos a1) (y_increasing a1 np))) h,
id          └─────────────────────┘   └─────┘  └───┘      └──────────┘ └┘       
src  ─────┘ └─────────────────────┘ └─────┘ └───┘  └┘ └──────────┘    └──┘ └─
typ  ─────┘ └─────────────────────┘ └─────┘ └───┘  └┘ └──────────┘└┘  └──┘└─
doc  ─────┘                                        └┘                 └──┘ └─
txt  ─────┘                                        └┘                 └──┘ └─
par  ─────┘                                        └┘                 └──┘ └─
pid  ─────┘                                        └┘                 └──┘ └─
st   ──────────────────────────────────────────────────────────────────────────────
395    by cases this; simp at h; exact ⟨h.symm, rfl⟩
id              └──┘                    └────┘  └─┘
src  ─┘  └────┘    └┘└───────┘└──────┘ └────┘└┘└─┘└─
typ  ─┘  └────┘└──┘└┘└───────┘└──────┘ └────┘└┘└─┘└─
doc  ─┘  └────┘    └┘└───────┘└──────┘       └┘   └─
txt  ─┘  └────┘    └┘└───────┘└──────┘       └┘   └─
par  ─┘  └────┘    └┘└───────┘└──────┘       └┘   └─
pid  ─┘  └─────┘    └─────────────────┘       └┘   └─
st   ───┘└───────────────────────────────────────────
396  
src  
typ  
doc  
txt  
par  
pid  
st   
397    theorem eq_of_xn_modeq_lem3 {i n} (npos : n > 0) :
id                                                
src  ─┘                                            
typ  ─┘                                           
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
398      Π {j}, i < j → j ≤ 2 * n → j ≠ n → ¬(a = 2 ∧ n = 1 ∧ i = 0 ∧ j = 2) → xn i % xn n < xn j % xn n
id                                                     └┘   └┘   └┘   └┘ 
src                                                                └┘    └┘    └┘    └┘
typ                                                    └┘   └┘   └┘   └┘ 
doc                                                                            └┘     └┘     └┘     └┘
399    | 0     ij _   _   _     := absurd ij (nat.not_lt_zero _)
id             └┘                  └────┘     └─────────────┘
src                                └────┘     └─────────────┘
typ            └┘                  └────┘     └─────────────┘
400    | (j+1) ij j2n jnn ntriv :=
id           └┘ └─┘ └─┘
src        
typ          └┘ └─┘ └─┘
401      have lem2 : ∀k > n, k ≤ 2*n → (↑(xn k % xn n) : ℤ) = xn n - xn (2 * n - k), from λk kn k2n,
id                                 └┘   └┘        └┘   └┘                 └┘ └─┘
src                                   └┘    └┘         └┘    └┘       
typ                                └┘   └┘        └┘   └┘                 └┘ └─┘
doc                                       └┘     └┘           └┘     └┘
402        let k2nl := lt_of_add_lt_add_right $ show 2*n-k+k < n+k, by
id             └──┘    └────────────────────┘           
src                    └────────────────────┘               
typ            └──┘    └────────────────────┘           
st                                                                    
403          {rw nat.sub_add_cancel, rw two_mul; exact (add_lt_add_left kn n), exact k2n } in
id               └────────────────┘     └─────┘         └─────────────┘ └┘          └─┘
src           └─┘└────────────────┘  └─┘└─────┘  └────┘ └─────────────┘     └────┘   
typ           └─┘└────────────────┘  └─┘└─────┘  └────┘ └─────────────┘└┘  └────┘└─┘
doc           └─┘                    └─┘         └────┘                     └────┘   
txt           └─┘                    └─┘         └────┘                     └────┘   
par           └─┘                    └─┘         └────┘                     └────┘   
pid                                                                              
st   ─────────────────────────────┘└────────────────────────────────────────┘└──────────┘└┘
404        have xle : xn (2 * n - k) ≤ xn n, from le_of_lt $ x_increasing k2nl,
id                    └┘          └┘        └──────┘   └──────────┘ └──┘
src                   └┘            └┘         └──────┘   └──────────┘
typ                   └┘          └┘        └──────┘   └──────────┘ └──┘
doc                   └┘               └┘
405        suffices xn k % xn n = xn n - xn (2 * n - k), by rw [this, int.coe_nat_sub xle],
id                  └┘   └┘   └┘   └┘                 └──┘  └─────────────┘ └─┘
src                 └┘    └┘    └┘    └┘               └──┘    └┘└─────────────┘   
typ                 └┘   └┘   └┘   └┘             └──┘└──┘└┘└─────────────┘└─┘
doc                 └┘     └┘     └┘     └┘                 └──┘    └┘                  
txt                                                         └──┘    └┘                  
par                                                         └──┘    └┘                  
pid                                                           └┘    └┘                  
st                                                         └───────┘└───────────────────┘
406        by {
st           └──
407          rw ← nat.mod_eq_of_lt (nat.sub_lt (x_pos a1 n) (x_pos a1 (2 * n - k))),
id                └──────────────┘  └────────┘               └───┘ └┘       
src          └───┘└──────────────┘ └────────┘         └┘ └───┘   └┘  └─┘
typ          └───┘└──────────────┘ └────────┘         └┘ └───┘└┘ └┘└─┘
doc          └───┘                                    └┘         └┘    └─┘
txt          └───┘                                    └┘         └┘    └─┘
par          └───┘                                    └┘         └┘    └─┘
pid            └─┘                                    └┘         └┘    └─┘
st   ─────────────────────────────────────────────────────────────────────────────┘└─
408          apply modeq.modeq_add_cancel_right (modeq.refl (xn a1 (2 * n - k))),
id                 └──────────────────────────┘  └────────┘  └┘ └┘         
src          └────┘└──────────────────────────┘ └────────┘ └┘   └┘    └─┘
typ          └────┘└──────────────────────────┘ └────────┘ └┘└┘ └┘  └─┘
doc          └────┘                                        └┘   └┘    └─┘
txt          └────┘                                             └┘    └─┘
par          └────┘                                             └┘    └─┘
pid                                                            └┘    └─┘
st   ──────────────────────────────────────────────────────────────────────────┘└─
409          rw [nat.sub_add_cancel xle],
id               └────────────────┘ └─┘
src          └──┘└────────────────┘   
typ          └──┘└────────────────┘└─┘
doc          └──┘                     
txt          └──┘                     
par          └──┘                     
pid            └┘                     
st   ─────────────────────────────────┘└──
410          have t := xn_modeq_x2n_sub_lem a1 (le_of_lt k2nl),
id                     └──────────────────┘ └┘  └──────┘ └──┘
src          └────────┘└──────────────────┘   └──────┘    
typ          └────────┘└──────────────────┘└┘ └──────┘└──┘
doc          └────────┘                                   
txt          └────────┘                                   
par          └────────┘                                   
pid          └────┘└─┘                                   
st   ────────────────────────────────────────────────────────┘└─
411          rw nat.sub_sub_self k2n at t,
id              └──────────────┘ └─┘
src          └─┘└──────────────┘   └───┘
typ          └─┘└──────────────┘└─┘└───┘
doc          └─┘                   └───┘
txt          └─┘                   └───┘
par          └─┘                   └───┘
pid                               └───┘
st   ───────────────────────────────────┘└─
412          exact t.trans (modeq.modeq_zero_iff.2 $ dvd_refl _).symm },
id                 └─────┘  └──────────────────┘     └──────┘
src          └────┘└─────┘ └──────────────────┘└─┘ └──────┘└───────┘
typ          └────┘└─────┘ └──────────────────┘└─┘ └──────┘└───────┘
doc          └────┘                            └─┘         └───────┘
txt          └────┘                            └─┘         └───────┘
par          └────┘                            └─┘         └───────┘
pid                                           └─┘         └─────┘└┘
st   ────────────────────────────────────────────────────────────────┘└┘
413      (lt_trichotomy j n).elim
id        └───────────┘    └──┘
src       └───────────┘     └──┘
typ       └───────────┘    └──┘
414      (λ (jn : j < n), eq_of_xn_modeq_lem1 ij (lt_of_le_of_ne jn jnn)) $ λo, o.elim
id                      └─────────────────┘     └────────────┘ └┘            └───┘
src                      └─────────────────┘     └────────────┘                 └───┘
typ                     └─────────────────┘     └────────────┘ └┘            └───┘
415      (λ (jn : j = n), by {
id                   
src                 
typ                  
st                          └──
416        cases jn,
id               └┘
src        └────┘
typ        └────┘└┘
doc        └────┘
txt        └────┘
par        └────┘
pid             
st   ─────────────┘└─
417        apply int.lt_of_coe_nat_lt_coe_nat,
id               └──────────────────────────┘
src        └────┘└──────────────────────────┘
typ        └────┘└──────────────────────────┘
doc        └────┘
txt        └────┘
par        └────┘
pid             
st   ───────────────────────────────────────┘└─
418        rw [lem2 (n+1) (nat.lt_succ_self _) j2n,
id             └──┘      └──────────────┘    └─┘
src        └──┘      └─┘ └──────────────┘└──┘   └─
typ        └──┘└──┘ └─┘ └──────────────┘└──┘└─┘└─
doc        └──┘       └─┘                 └──┘   └─
txt        └──┘       └─┘                 └──┘   └─
par        └──┘       └─┘                 └──┘   └─
pid          └┘       └─┘                 └──┘   └─
st   ────────────────────────────────────────────┘└─
419            show 2 * n - (n + 1) = n - 1, by rw[two_mul, ← nat.sub_sub, nat.add_sub_cancel]],
id                                               └─────┘    └─────────┘  └────────────────┘
src  ─────────┘    └─┘      └──┘  └────────┘└─────┘└──┘└─────────┘└┘└────────────────┘└┘
typ  ─────────┘    └─┘      └──┘ └────────┘└─────┘└──┘└─────────┘└┘└────────────────┘└┘
doc  ─────────┘    └─┘      └──┘   └────────┘       └──┘           └┘                  └┘
txt  ─────────┘    └─┘      └──┘   └────────┘       └──┘           └┘                  └┘
par  ─────────┘    └─┘      └──┘   └────────┘       └──┘           └┘                  └┘
pid  ─────────┘    └─┘      └──┘   └────────┘       └──┘           └┘                  └┘
st   ─────────────────────────────────────────┘└─────────┘└─────────────┘└──────────────────┘└──
420        refine lt_sub_left_of_add_lt (int.coe_nat_lt_coe_nat_of_lt _),
id                └───────────────────┘  └──────────────────────────┘
src        └─────┘└───────────────────┘ └──────────────────────────┘└─┘
typ        └─────┘└───────────────────┘ └──────────────────────────┘└─┘
doc        └─────┘                                                  └─┘
txt        └─────┘                                                  └─┘
par        └─────┘                                                  └─┘
pid                                                                └─┘
st   ──────────────────────────────────────────────────────────────────┘└─
421        cases (lt_or_eq_of_le $ nat.le_of_succ_le_succ ij) with lin ein,
id                └────────────┘   └────────────────────┘ └┘
src        └────┘ └────────────┘ └────────────────────┘  └────────────┘
typ        └────┘ └────────────┘ └────────────────────┘└┘└────────────┘
doc        └────┘                                        └────────────┘
txt        └────┘                                        └────────────┘
par        └────┘                                        └────────────┘
pid                                                     └───────────┘
st   ────────────────────────────────────────────────────────────────────┘└─
422        { rw nat.mod_eq_of_lt (x_increasing _ lin),
id              └──────────────┘  └──────────┘   └─┘
src          └─┘└──────────────┘ └──────────┘└─┘   
typ          └─┘└──────────────┘ └──────────┘└─┘└─┘
doc          └─┘                             └─┘   
txt          └─┘                             └─┘   
par          └─┘                             └─┘   
pid                                         └─┘   
st   ───────┘└──────────────────────────────────────┘└─
423          have ll : xn a1 (n-1) + xn a1 (n-1) ≤ xn a1 n,
id                                                └┘ └┘ 
src          └────────┘       └─┘        └─┘└┘  
typ          └────────┘       └─┘        └─┘└┘└┘
doc          └────────┘       └─┘        └─┘ └┘  
txt          └────────┘       └─┘        └─┘     
par          └────────┘       └─┘        └─┘     
pid          └─────┘└─┘       └─┘        └─┘     
st   ────────────────────────────────────────────────────┘└─
424          { rw [← two_mul, mul_comm, show xn a1 n = xn a1 (n-1+1), by rw [nat.sub_add_cancel npos], xn_succ],
id                   └─────┘  └──────┘                └┘ └┘                └────────────────┘ └──┘   └─────┘
src            └────┘└─────┘└┘└──────┘└┘          └┘      └─────────┘└────────────────┘    └─┘└─────┘
typ            └────┘└─────┘└┘└──────┘└┘         └┘└┘   └─────────┘└────────────────┘└──┘└─┘└─────┘
doc            └────┘       └┘        └┘          └┘      └─────────┘                      └─┘       
txt            └────┘       └┘        └┘                  └─────────┘                      └─┘       
par            └────┘       └┘        └┘                  └─────────┘                      └─┘       
pid              └──┘       └┘        └┘                  └─────────┘                      └─┘       
st   ─────────┘└───────────┘└────────┘└────────────────────────────────┘└──────────────────────────┘└───────┘└──
425            exact le_trans (nat.mul_le_mul_left _ a1) (nat.le_add_right _ _) },
id                   └──────┘  └─────────────────┘   └┘   └──────────────┘
src            └────┘└──────┘ └─────────────────┘└─┘  └┘ └──────────────┘└────┘
typ            └────┘└──────┘ └─────────────────┘└─┘└┘└┘ └──────────────┘└────┘
doc            └────┘                            └─┘  └┘                 └────┘
txt            └────┘                            └─┘  └┘                 └────┘
par            └────┘                            └─┘  └┘                 └────┘
pid                                             └─┘  └┘                 └───┘
st   ──────────────────────────────────────────────────────────────────────────┘└┘
426          have npm : (n-1).succ = n := nat.succ_pred_eq_of_pos npos,
id                                       └─────────────────────┘ └──┘
src          └─────────┘   └──────┘  └──┘└─────────────────────┘
typ          └─────────┘   └──────┘ └──┘└─────────────────────┘└──┘
doc          └─────────┘   └──────┘  └──┘                       
txt          └─────────┘   └──────┘  └──┘                       
par          └─────────┘   └──────┘  └──┘                       
pid          └──────┘└─┘   └──────┘  └──┘                       
st   ────────────────────────────────────────────────────────────────┘└─
427          have il : i ≤ n - 1 := by apply nat.le_of_succ_le_succ; rw npm; exact lin,
id                                         └────────────────────┘     └─┘        └─┘
src          └────────┘    └────┘  └────┘└────────────────────┘└┘└─┘   └┘└────┘
typ          └────────┘  └────┘  └────┘└────────────────────┘└┘└─┘└─┘└┘└────┘└─┘
doc          └────────┘    └────┘  └────┘                      └┘└─┘   └┘└────┘
txt          └────────┘    └────┘  └────┘                      └┘└─┘   └┘└────┘
par          └────────┘    └────┘  └────┘                      └┘└─┘   └┘└────┘
pid          └─────┘└─┘    └───┘  └─────┘                      └───┘   └──────┘
st   ────────────────────────────────┘└────────────────────────────────┘└─┘└─────────┘└─
428          cases lt_or_eq_of_le il with ill ile,
id                 └────────────┘ └┘
src          └────┘└────────────┘  └───────────┘
typ          └────┘└────────────┘└┘└───────────┘
doc          └────┘                └───────────┘
txt          └────┘                └───────────┘
par          └────┘                └───────────┘
pid                               └───────────┘
st   ───────────────────────────────────────────┘└─
429          { exact lt_of_lt_of_le (nat.add_lt_add_left (x_increasing a1 ill) _) ll },
id                   └────────────┘  └─────────────────┘  └──────────┘ └┘ └─┘     └┘
src            └────┘└────────────┘ └─────────────────┘ └──────────┘     └───┘  
typ            └────┘└────────────┘ └─────────────────┘ └──────────┘└┘└─┘└───┘└┘
doc            └────┘                                                    └───┘  
txt            └────┘                                                    └───┘  
par            └────┘                                                    └───┘  
pid                                                                     └───┘  
st   ─────────┘└────────────────────────────────────────────────────────────────────┘└┘
430          { rw ile,
id                └─┘
src            └─┘
typ            └─┘└─┘
doc            └─┘
txt            └─┘
par            └─┘
pid              
st   ───────────────┘└─
431            apply lt_of_le_of_ne ll,
id                   └────────────┘ └┘
src            └────┘└────────────┘
typ            └────┘└────────────┘└┘
doc            └────┘              
txt            └────┘              
par            └────┘              
pid                               
st   ────────────────────────────────┘└─
432            rw ← two_mul,
id                  └─────┘
src            └───┘└─────┘
typ            └───┘└─────┘
doc            └───┘
txt            └───┘
par            └───┘
pid              └─┘
st   ─────────────────────┘└─
433            exact λe, ntriv $
id                       └───┘
src            └────┘ └─┘      
typ            └────┘ └─┘└───┘ 
doc            └────┘ └─┘      
txt            └────┘ └─┘      
par            └────┘ └─┘      
pid                  └─┘      
st   ────────────────────────────
434              let ⟨a2, s1⟩ := @eq_of_xn_modeq_lem2 _ a1 (n-1) (by rw[nat.sub_add_cancel npos]; exact e) in
id                        └┘      └─────────────────┘   └┘             └────────────────┘ └──┘         
src  ───────────┘      └┘  └───┘ └─────────────────┘└─┘     └─┘   └─┘└────────────────┘    └──────┘ └────
typ  ───────────┘      └┘└┘└───┘ └─────────────────┘└─┘└┘  └─┘   └─┘└────────────────┘└──┘└──────┘└────
doc  ───────────┘      └┘  └───┘                    └─┘     └─┘   └─┘                      └──────┘ └────
txt  ───────────┘      └┘  └───┘                    └─┘     └─┘   └─┘                      └──────┘ └────
par  ───────────┘      └┘  └───┘                    └─┘     └─┘   └─┘                      └──────┘ └────
pid  ───────────┘      └┘  └───┘                    └─┘     └─┘   └──┘                      └───────┘ └────
st   ──────────────────────────────────────────────────────────────┘└─────────────────────────┘└───────┘└────
435              have n1 : n = 1, from le_antisymm (nat.le_of_sub_eq_zero s1) npos,
id                                     └─────────┘  └───────────────────┘
src  ───────────┘    └────┘  └───────┘└─────────┘ └───────────────────┘  └┘    └─
typ  ───────────┘    └────┘  └───────┘└─────────┘ └───────────────────┘  └┘    └─
doc  ───────────┘    └────┘  └───────┘                                   └┘    └─
txt  ───────────┘    └────┘  └───────┘                                   └┘    └─
par  ───────────┘    └────┘  └───────┘                                   └┘    └─
pid  ───────────┘    └────┘  └───────┘                                   └┘    └─
st   ───────────────────────────────────────────────────────────────────────────────
436              by rw [ile, a2, n1]; exact ⟨rfl, rfl, rfl, rfl⟩ } },
id                      └─┘  └┘  └┘                         └─┘
src  ───────────┘  └──┘   └┘  └┘  └──────┘    └┘   └┘   └┘└─┘└┘
typ  ───────────┘  └──┘└─┘└┘└┘└┘└┘└──────┘    └┘   └┘   └┘└─┘└┘
doc  ───────────┘  └──┘   └┘  └┘  └──────┘    └┘   └┘   └┘   └┘
txt  ───────────┘  └──┘   └┘  └┘  └──────┘    └┘   └┘   └┘   └┘
par  ───────────┘  └──┘   └┘  └┘  └──────┘    └┘   └┘   └┘   └┘
pid  ───────────┘  └───┘   └┘  └┘  └───────┘    └┘   └┘   └┘   └┘
st   ─────────────┘└──────┘└──┘└──┘└───────────────────────────┘└──┘
437        { rw [ein, nat.mod_self, add_zero],
id               └─┘  └──────────┘  └──────┘
src          └──┘   └┘└──────────┘└┘└──────┘
typ          └──┘└─┘└┘└──────────┘└┘└──────┘
doc          └──┘   └┘            └┘        
txt          └──┘   └┘            └┘        
par          └──┘   └┘            └┘        
pid            └┘   └┘            └┘        
st   ──────────────┘└────────────┘└────────┘└─
438          exact x_increasing _ (nat.pred_lt $ ne_of_gt npos) } })
id                 └──────────┘    └─────────┘   └──────┘ └──┘
src          └────┘└──────────┘└─┘ └─────────┘ └──────┘    └┘
typ          └────┘└──────────┘└─┘ └─────────┘ └──────┘└──┘└┘
doc          └────┘            └─┘                         └┘
txt          └────┘            └─┘                         └┘
par          └────┘            └─┘                         └┘
pid                           └─┘                         
st   ──────────────────────────────────────────────────────────┘└──┘
439      (λ (jn : j > n),
id                   
src                 
typ                  
440        have lem1 : j ≠ n → xn j % xn n < xn (j + 1) % xn n → xn i % xn n < xn (j + 1) % xn n, from λjn s,
id                           └┘    └┘   └┘         └┘    └┘   └┘   └┘         └┘         └┘ 
src                           └┘    └┘    └┘         └┘     └┘    └┘    └┘         └┘
typ                          └┘    └┘   └┘         └┘    └┘   └┘   └┘         └┘         └┘ 
doc                            └┘     └┘     └┘           └┘     └┘     └┘     └┘           └┘
441        (lt_or_eq_of_le (nat.le_of_succ_le_succ ij)).elim
id          └────────────┘  └────────────────────┘     └──┘
src         └────────────┘  └────────────────────┘     └──┘
typ         └────────────┘  └────────────────────┘     └──┘
442          (λh, lt_trans (eq_of_xn_modeq_lem3 h (le_of_lt j2n) jn $ λ⟨a1, n1, i0, j2⟩,
id               └──────┘  └─────────────────┘   └──────┘      └┘    
src               └──────┘                         └──────┘
typ              └──────┘  └─────────────────┘   └──────┘      └┘    
443            by rw [n1, j2] at j2n; exact absurd j2n dec_trivial) s)
id                    └┘  └┘                └────┘ └─┘ └─────────┘  
src               └──┘  └┘  └──────┘  └────┘└────┘   └─────────┘
typ               └──┘└┘└┘└┘└──────┘  └────┘└────┘└─┘└─────────┘  
doc               └──┘  └┘  └──────┘  └────┘         └─────────┘
txt               └──┘  └┘  └──────┘  └────┘         
par               └──┘  └┘  └──────┘  └────┘         
pid                 └┘  └┘  └─────┘                
st               └─────┘└──┘└───────────────────────────────────┘
444          (λh, by rw h; exact s),
id                             
src                  └─┘   └────┘
typ                 └─┘  └────┘
doc                  └─┘   └────┘
txt                  └─┘   └────┘
par                  └─┘   └────┘
pid                            
st                  └────────────┘
445        lem1 (ne_of_gt jn) $ int.lt_of_coe_nat_lt_coe_nat $ by {
id         └──┘  └──────┘ └┘    └──────────────────────────┘
src              └──────┘       └──────────────────────────┘
typ        └──┘  └──────┘ └┘    └──────────────────────────┘
st                                                               └──
446          rw [lem2 j jn (le_of_lt j2n), lem2 (j+1) (nat.le_succ_of_le jn) j2n],
id               └──┘  └┘  └──────┘ └─┘   └──┘       └───────────────┘ └┘  └─┘
src          └──┘        └──────┘   └─┘       └─┘ └───────────────┘  └┘   
typ          └──┘└──┘└┘ └──────┘└─┘└─┘└──┘  └─┘ └───────────────┘└┘└┘└─┘
doc          └──┘                   └─┘       └─┘                    └┘   
txt          └──┘                   └─┘       └─┘                    └┘   
par          └──┘                   └─┘       └─┘                    └┘   
pid            └┘                   └─┘       └─┘                    └┘   
st   ───────────────────────────────────┘└─────────────────────────────────────┘└──
447          refine sub_lt_sub_left (int.coe_nat_lt_coe_nat_of_lt $ x_increasing _ _) _,
id                  └─────────────┘  └──────────────────────────┘   └──────────┘
src          └─────┘└─────────────┘ └──────────────────────────┘ └──────────┘└─────┘
typ          └─────┘└─────────────┘ └──────────────────────────┘ └──────────┘└─────┘
doc          └─────┘                                                         └─────┘
txt          └─────┘                                                         └─────┘
par          └─────┘                                                         └─────┘
pid                                                                         └─────┘
st   ─────────────────────────────────────────────────────────────────────────────────┘└─
448          rw [nat.sub_succ],
id               └──────────┘
src          └──┘└──────────┘
typ          └──┘└──────────┘
doc          └──┘            
txt          └──┘            
par          └──┘            
pid            └┘            
st   ───────────────────────┘└──
449          exact nat.pred_lt (ne_of_gt $ nat.sub_pos_of_lt j2n) })
id                 └─────────┘  └──────┘   └───────────────┘ └─┘
src          └────┘└─────────┘ └──────┘ └───────────────┘   └┘
typ          └────┘└─────────┘ └──────┘ └───────────────┘└─┘└┘
doc          └────┘                                         └┘
txt          └────┘                                         └┘
par          └────┘                                         └┘
pid                                                        
st   ────────────────────────────────────────────────────────────┘└┘
450  
451    theorem eq_of_xn_modeq_le {i j n} (npos : n > 0) (ij : i ≤ j) (j2n : j ≤ 2 * n) (h : xn i ≡ xn j [MOD xn n])
id                                                                                 └┘   └┘  └──┘ └┘ 
src                                                                                     └┘    └┘   └──┘ └┘  
typ                                                                                └┘   └┘  └──┘ └┘ 
doc                                                                                         └┘    └┘   └──┘ └┘  
452      (ntriv : ¬(a = 2 ∧ n = 1 ∧ i = 0 ∧ j = 2)) : i = j :=
id                                          
src                                             
typ                                         
453    (lt_or_eq_of_le ij).resolve_left $ λij',
id      └────────────┘ └┘ └──────────┘     └─┘
src     └────────────┘    └──────────┘
typ     └────────────┘ └┘ └──────────┘     └─┘
454    if jn : j = n then by {
id     └┘        
src    └┘        
typ    └┘        
st                          └──
455      refine ne_of_gt _ h,
id              └──────┘   
src      └─────┘└──────┘└─┘
typ      └─────┘└──────┘└─┘
doc      └─────┘        └─┘
txt      └─────┘        └─┘
par      └─────┘        └─┘
pid                    └─┘
st   ──────────────────────┘└─
456      rw [jn, nat.mod_self],
id           └┘  └──────────┘
src      └──┘  └┘└──────────┘
typ      └──┘└┘└┘└──────────┘
doc      └──┘  └┘            
txt      └──┘  └┘            
par      └──┘  └┘            
pid        └┘  └┘            
st   ─────────┘└────────────┘└──
457      have x0 : xn a1 0 % xn a1 n > 0 := by rw [nat.mod_eq_of_lt (x_increasing a1 npos)]; exact dec_trivial,
id                          └┘ └┘               └──────────────┘  └──────────┘ └┘ └──┘          └─────────┘
src      └────────┘    └─┘└┘   └────┘  └──┘└──────────────┘ └──────────┘      └┘└┘└────┘└─────────┘
typ      └────────┘    └─┘└┘└┘└────┘  └──┘└──────────────┘ └──────────┘└┘└──┘└┘└┘└────┘└─────────┘
doc      └────────┘    └─┘ └┘    └────┘  └──┘                                   └┘└┘└────┘└─────────┘
txt      └────────┘    └─┘       └────┘  └──┘                                   └┘└┘└────┘
par      └────────┘    └─┘       └────┘  └──┘                                   └┘└┘└────┘
pid      └─────┘└─┘    └─┘       └───┘  └───┘                                   └────────┘
st   ────────────────────────────────────────┘└──────────────────────────────────────────┘└─────────────────┘└─
458      cases i with i, exact x0,
id                            └┘
src      └────┘ └─────┘  └────┘
typ      └────┘└─────┘  └────┘└┘
doc      └────┘ └─────┘  └────┘
txt      └────┘ └─────┘  └────┘
par      └────┘ └─────┘  └────┘
pid            └─────┘       
st   ─────────────────┘└────────┘└─
459      rw jn at ij',
id          └┘
src      └─┘  └─────┘
typ      └─┘└┘└─────┘
doc      └─┘  └─────┘
txt      └─┘  └─────┘
par      └─┘  └─────┘
pid          └─────┘
st   ───────────────┘└─
460      exact lt_trans x0 (eq_of_xn_modeq_lem3 _ npos (nat.succ_pos _) (le_trans ij j2n) (ne_of_lt ij') $
id             └──────┘ └┘  └─────────────────┘   └──┘  └──────────┘     └──────┘ └┘ └─┘   └──────┘ └─┘
src      └────┘└──────┘   └─────────────────┘└─┘     └──────────┘└──┘ └──────┘     └┘ └──────┘   └┘ 
typ      └────┘└──────┘└┘ └─────────────────┘└─┘└──┘ └──────────┘└──┘ └──────┘└┘└─┘└┘ └──────┘└─┘└┘ 
doc      └────┘                              └─┘                 └──┘              └┘            └┘ 
txt      └────┘                              └─┘                 └──┘              └┘            └┘ 
par      └────┘                              └─┘                 └──┘              └┘            └┘ 
pid                                         └─┘                 └──┘              └┘            └┘ 
st   ──────────────────────────────────────────────────────────────────────────────────────────────────────
461        λ⟨a1, n1, _, i2⟩, by rw [n1, i2] at ij'; exact absurd ij' dec_trivial)
id                                  └┘  └┘                └────┘ └─┘
src  ─────┘   └┘  └───┘  └─┘  └──┘  └┘  └──────┘└──────┘└────┘              └─
typ  ─────┘   └┘  └───┘  └─┘  └──┘└┘└┘└┘└──────┘└──────┘└────┘└─┘           └─
doc  ─────┘   └┘  └───┘  └─┘  └──┘  └┘  └──────┘└──────┘                    └─
txt  ─────┘   └┘  └───┘  └─┘  └──┘  └┘  └──────┘└──────┘                    └─
par  ─────┘   └┘  └───┘  └─┘  └──┘  └┘  └──────┘└──────┘                    └─
pid  ─────┘   └┘  └───┘  └─┘  └───┘  └┘  └──────────────┘                    
st   ─────────────────────────┘└─────┘└──┘└───────────────────────────────────┘└─
462    } else ne_of_lt (eq_of_xn_modeq_lem3 npos ij' j2n jn ntriv) h
id            └──────┘  └─────────────────┘ └──┘ └─┘ └─┘ └┘ └───┘  
src  ─┘       └──────┘  └─────────────────┘
typ  ─┘       └──────┘  └─────────────────┘ └──┘ └─┘ └─┘ └┘ └───┘  
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘└┘
463  
464    theorem eq_of_xn_modeq {i j n} (npos : n > 0) (i2n : i ≤ 2 * n) (j2n : j ≤ 2 * n) (h : xn i ≡ xn j [MOD xn n])
id                                                                                  └┘   └┘  └──┘ └┘ 
src                                                                                      └┘    └┘   └──┘ └┘  
typ                                                                                 └┘   └┘  └──┘ └┘ 
doc                                                                                           └┘    └┘   └──┘ └┘  
465      (ntriv : a = 2 → n = 1 → (i = 0 → j ≠ 2) ∧ (i = 2 → j ≠ 0)) : i = j :=
id                                                          
src                                                               
typ                                                         
466    (le_total i j).elim
id      └──────┘   └──┘
src     └──────┘     └──┘
typ     └──────┘   └──┘
467      (λij, eq_of_xn_modeq_le npos ij j2n h $ λ⟨a2, n1, i0, j2⟩, (ntriv a2 n1).left i0 j2)
id         └┘  └───────────────┘ └──┘ └┘ └─┘     └┘  └┘  └┘  └┘    └───┘       └──┘
src            └───────────────┘                                                 └──┘
typ        └┘  └───────────────┘ └──┘ └┘ └─┘     └┘  └┘  └┘  └┘    └───┘       └──┘
468      (λij, (eq_of_xn_modeq_le npos ij i2n h.symm $ λ⟨a2, n1, j0, i2⟩, (ntriv a2 n1).right i2 j0).symm)
id         └┘   └───────────────┘ └──┘ └┘ └─┘ └───┘    └┘  └┘  └┘  └┘    └───┘       └───┘        └──┘
src             └───────────────┘              └───┘                                   └───┘        └──┘
typ        └┘   └───────────────┘ └──┘ └┘ └─┘ └───┘    └┘  └┘  └┘  └┘    └───┘       └───┘        └──┘
469  
470    theorem eq_of_xn_modeq' {i j n} (ipos : i > 0) (hin : i ≤ n) (j4n : j ≤ 4 * n) (h : xn j ≡ xn i [MOD xn n]) :
id                                                                                └┘   └┘  └──┘ └┘ 
src                                                                                    └┘    └┘   └──┘ └┘  
typ                                                                               └┘   └┘  └──┘ └┘ 
doc                                                                                        └┘    └┘   └──┘ └┘  
471      j = i ∨ j + i = 4 * n :=
id                  
src                    
typ                 
472    have i2n : i ≤ 2*n, by apply le_trans hin; rw two_mul; apply nat.le_add_left,
id                              └──────┘ └─┘     └─────┘        └─────────────┘
src                         └────┘└──────┘     └─┘└─────┘  └────┘└─────────────┘
typ                       └────┘└──────┘└─┘  └─┘└─────┘  └────┘└─────────────┘
doc                           └────┘             └─┘         └────┘
txt                           └────┘             └─┘         └────┘
par                           └────┘             └─┘         └────┘
pid                                                             
st                           └──────────────────────┘└─────┘└─────────────────────┘
473    have npos : n > 0, from lt_of_lt_of_le ipos hin,
id                           └────────────┘ └──┘ └─┘
src                           └────────────┘
typ                          └────────────┘ └──┘ └─┘
474    (le_or_gt j (2 * n)).imp
id      └──────┘        └─┘
src     └──────┘          └─┘
typ     └──────┘        └─┘
475      (λj2n : j ≤ 2*n, eq_of_xn_modeq npos j2n i2n h $
id                    └────────────┘ └──┘ └─┘ └─┘ 
src                     └────────────┘
typ                   └────────────┘ └──┘ └─┘ └─┘ 
476        λa2 n1, ⟨λj0 i2, by rw [n1, i2] at hin; exact absurd hin dec_trivial,
id          └┘ └┘    └┘ └┘         └┘  └┘                └────┘ └─┘ └─────────┘
src                            └──┘  └┘  └──────┘  └────┘└────┘   └─────────┘
typ         └┘ └┘    └┘ └┘     └──┘└┘└┘└┘└──────┘  └────┘└────┘└─┘└─────────┘
doc                            └──┘  └┘  └──────┘  └────┘         └─────────┘
txt                            └──┘  └┘  └──────┘  └────┘         
par                            └──┘  └┘  └──────┘  └────┘         
pid                              └┘  └┘  └─────┘                
st                            └─────┘└──┘└───────────────────────────────────┘
477                 λj2 i0, ne_of_gt ipos i0⟩)
id                   └┘ └┘  └──────┘ └──┘ └┘
src                         └──────┘
typ                  └┘ └┘  └──────┘ └──┘ └┘
478      (λj2n : j > 2*n, suffices i = 4*n - j, by rw [this, nat.add_sub_of_le j4n],
id                                           └──┘  └───────────────┘ └─┘
src                                           └──┘    └┘└───────────────┘   
typ                                      └──┘└──┘└┘└───────────────┘└─┘
doc                                                └──┘    └┘                    
txt                                                └──┘    └┘                    
par                                                └──┘    └┘                    
pid                                                  └┘    └┘                    
st                                                └───────┘└─────────────────────┘
479       have j42n : 4*n - j ≤ 2*n, from @nat.le_of_add_le_add_right j _ _ $
id                                  └────────────────────────┘ 
src                                    └────────────────────────┘
typ                                 └────────────────────────┘ 
480       by rw [nat.sub_add_cancel j4n, show 4*n = 2*n + 2*n, from right_distrib 2 2 n];
id               └────────────────┘ └─┘                          └───────────┘     
src          └──┘└────────────────┘   └┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘ 
typ          └──┘└────────────────┘└─┘└┘    └┘ └┘  └┘  └─────┘└───────────┘└───┘
doc          └──┘                     └┘    └┘   └┘   └┘  └─────┘             └───┘ 
txt          └──┘                     └┘    └┘   └┘   └┘  └─────┘             └───┘ 
par          └──┘                     └┘    └┘   └┘   └┘  └─────┘             └───┘ 
pid            └┘                     └┘    └┘   └┘   └┘  └─────┘             └───┘ 
st          └─────────────────────────┘└──────────────────────────────────────────────┘└─
481          exact nat.add_le_add_left (le_of_lt j2n) _,
id                 └─────────────────┘  └──────┘ └─┘
src          └────┘└─────────────────┘ └──────┘   └─┘
typ          └────┘└─────────────────┘ └──────┘└─┘└─┘
doc          └────┘                               └─┘
txt          └────┘                               └─┘
par          └────┘                               └─┘
pid                                              └─┘
st   ─────────────────────────────────────────────────┘
482       eq_of_xn_modeq npos i2n j42n
id        └────────────┘ └──┘ └─┘ └──┘
src       └────────────┘
typ       └────────────┘ └──┘ └─┘ └──┘
483         (h.symm.trans $ let t := xn_modeq_x4n_sub j42n in by rwa [nat.sub_sub_self j4n] at t)
id           └───┘└────┘           └──────────────┘ └──┘            └──────────────┘ └─┘
src           └───┘└────┘            └──────────────┘            └───┘└──────────────┘   └────┘
typ          └───┘└────┘           └──────────────┘ └──┘       └───┘└──────────────┘└─┘└────┘
doc                                                              └───┘                   └────┘
txt                                                              └───┘                   └────┘
par                                                              └───┘                   └────┘
pid                                                                 └┘                   └───┘
st                                                              └────────────────────────┘└───┘
484         (λa2 n1, ⟨λi0, absurd i0 (ne_of_gt ipos), λi2, by rw[n1, i2] at hin; exact absurd hin dec_trivial⟩))
id            └┘ └┘    └┘  └────┘ └┘  └──────┘ └──┘    └┘        └┘  └┘                └────┘ └─┘
src                        └────┘     └──────┘                └─┘  └┘  └──────┘  └────┘└────┘   
typ           └┘ └┘    └┘  └────┘ └┘  └──────┘ └──┘    └┘     └─┘└┘└┘└┘└──────┘  └────┘└────┘└─┘
doc                                                           └─┘  └┘  └──────┘  └────┘         
txt                                                           └─┘  └┘  └──────┘  └────┘         
par                                                           └─┘  └┘  └──────┘  └────┘         
pid                                                               └┘  └─────┘                
st                                                           └────┘└──┘└───────────────────────────────────┘
485  
486    theorem modeq_of_xn_modeq {i j n} (ipos : i > 0) (hin : i ≤ n) (h : xn j ≡ xn i [MOD xn n]) :
id                                                                    └┘   └┘  └──┘ └┘ 
src                                                                      └┘    └┘   └──┘ └┘  
typ                                                                   └┘   └┘  └──┘ └┘ 
doc                                                                        └┘    └┘   └──┘ └┘  
487      j ≡ i [MOD 4 * n] ∨ j + i ≡ 0 [MOD 4 * n] :=
id          └──┘            └──┘    
src           └──┘               └──┘     
typ         └──┘            └──┘    
doc           └──┘                  └──┘      
488    let j' := j % (4 * n) in
id         └┘          
src                    
typ        └┘          
489    have n4 : 4 * n > 0, from mul_pos dec_trivial (lt_of_lt_of_le ipos hin),
id                            └─────┘ └─────────┘  └────────────┘ └──┘ └─┘
src                            └─────┘ └─────────┘  └────────────┘
typ                           └─────┘ └─────────┘  └────────────┘ └──┘ └─┘
doc                                      └─────────┘
490    have jl : j' < 4 * n, from nat.mod_lt _ n4,
id               └┘            └────────┘   └┘
src                             └────────┘
typ              └┘            └────────┘   └┘
491    have jj : j ≡ j' [MOD 4 * n], by delta modeq; rw nat.mod_eq_of_lt jl,
id                 └┘ └──┘                         └──────────────┘ └┘
src                    └──┘          └─────────┘  └─┘└──────────────┘
typ                └┘ └──┘         └─────────┘  └─┘└──────────────┘└┘
doc                    └──┘           └─────────┘  └─┘                
txt                                     └─────────┘  └─┘                
par                                     └─────────┘  └─┘                
pid                                          └────┘                    
st                                     └───────────────┘└──────────────┘└─┘
492    have ∀j q, xn (j + 4 * n * q) ≡ xn j [MOD xn n], begin
id              └┘            └┘  └──┘ └┘ 
src               └┘               └┘   └──┘ └┘  
typ             └┘            └┘  └──┘ └┘ 
doc               └┘                  └┘   └──┘ └┘  
st                                                      └─────
493      intros j q, induction q with q IH, { simp },
id                             
src      └────────┘  └────────┘ └────────┘    └───┘
typ      └────────┘  └────────┘└────────┘    └───┘
doc      └────────┘  └────────┘ └────────┘    └───┘
txt      └────────┘  └────────┘ └────────┘    └───┘
par      └────────┘  └────────┘ └────────┘    └───┘
pid            └──┘            └───────┘        
st   ─────────────┘└─────────────────────┘└──┘└───┘└┘
494      rw[nat.mul_succ, ← add_assoc, add_comm],
id          └──────────┘    └───────┘  └──────┘
src      └─┘└──────────┘└──┘└───────┘└┘└──────┘
typ      └─┘└──────────┘└──┘└───────┘└┘└──────┘
doc      └─┘            └──┘         └┘        
txt      └─┘            └──┘         └┘        
par      └─┘            └──┘         └┘        
pid                    └──┘         └┘        
st   ──────────────────┘└───────────┘└────────┘└─
495      exact modeq.trans (xn_modeq_x4n_add _ _ _) IH
id             └─────────┘  └──────────────┘        └┘
src      └────┘└─────────┘ └──────────────┘└──────┘  
typ      └────┘└─────────┘ └──────────────┘└──────┘└┘
doc      └────┘                            └──────┘  
txt      └────┘                            └──────┘  
par      └────┘                            └──────┘  
pid                                       └──────┘  
st   ──────────────────────────────────────────────────
496    end,
src  ─┘
typ  ─┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘└─┘
497    or.imp
id     └────┘
src    └────┘
typ    └────┘
498      (λ(ji : j' = i), by rwa ← ji)
id               └┘              └┘
src                         └────┘
typ              └┘        └────┘└┘
doc                          └────┘
txt                          └────┘
par                          └────┘
pid                             └─┘
st                          └───────┘
499      (λ(ji : j' + i = 4 * n), (modeq.modeq_add jj (modeq.refl _)).trans $
id               └┘           └─────────────┘ └┘  └────────┘    └───┘
src                             └─────────────┘     └────────┘    └───┘
typ              └┘           └─────────────┘ └┘  └────────┘    └───┘
500        by rw ji; exact modeq.modeq_zero_iff.2 (dvd_refl _))
id               └┘        └──────────────────┘    └──────┘
src           └─┘    └────┘└──────────────────┘└─┘ └──────┘└─┘
typ           └─┘└┘  └────┘└──────────────────┘└─┘ └──────┘└─┘
doc           └─┘    └────┘                    └─┘         └─┘
txt           └─┘    └────┘                    └─┘         └─┘
par           └─┘    └────┘                    └─┘         └─┘
pid                                          └─┘         └─┘
st           └───────────────────────────────────────────────┘
501      (eq_of_xn_modeq' ipos hin (le_of_lt jl) $
id        └─────────────┘ └──┘ └─┘  └──────┘ └┘
src       └─────────────┘           └──────┘
typ       └─────────────┘ └──┘ └─┘  └──────┘ └┘
502        (modeq.symm (by rw ← nat.mod_add_div j (4*n); exact this j' _)).trans h)
id          └────────┘          └─────────────┘             └──┘ └┘    └───┘  
src         └────────┘     └───┘└─────────────┘     └────┘      └┘  └───┘
typ         └────────┘     └───┘└─────────────┘   └────┘└──┘└┘└┘  └───┘  
doc                        └───┘                     └────┘      └┘
txt                        └───┘                     └────┘      └┘
par                        └───┘                     └────┘      └┘
pid                          └─┘                                └┘
st                        └────────────────────────────────────────────┘
503  end
504  
505  theorem xy_modeq_of_modeq {a b c} (a1 : a > 1) (b1 : b > 1) (h : a ≡ b [MOD c]) :
id                                                                   └──┘ 
src                                                                      └──┘  
typ                                                                  └──┘ 
doc                                                                        └──┘  
506    ∀ n, xn a1 n ≡ xn b1 n [MOD c] ∧ yn a1 n ≡ yn b1 n [MOD c]
id         └┘ └┘   └┘ └┘  └──┘   └┘ └┘   └┘ └┘  └──┘ 
src         └┘       └┘      └──┘    └┘       └┘      └──┘  
typ        └┘ └┘   └┘ └┘  └──┘   └┘ └┘   └┘ └┘  └──┘ 
doc         └┘       └┘      └──┘     └┘       └┘      └──┘  
507  | 0 := by constructor; refl
src            └─────────┘  └───┘
typ            └─────────┘  └───┘
doc            └─────────┘  └───┘
txt            └─────────┘  └───┘
par            └─────────┘  └───┘
pid                             
st            └─────────────────┘
508  | 1 := by simp; exact ⟨h, modeq.refl 1⟩
id                            └────────┘
src            └──┘  └────┘  └┘└────────┘└──┘
typ            └──┘  └────┘ └┘└────────┘└──┘
doc            └──┘  └────┘  └┘          └──┘
txt            └──┘  └────┘  └┘          └──┘
par            └──┘  └────┘  └┘          └──┘
pid                         └┘          └─┘
st            └─────────────────────────────┘
509  | (n+2) := ⟨
id      
src      
typ     
510    modeq.modeq_add_cancel_right (xy_modeq_of_modeq n).left $
id     └──────────────────────────┘  └───────────────┘   └──┘
src    └──────────────────────────┘                      └──┘
typ    └──────────────────────────┘  └───────────────┘   └──┘
511      by rw [xn_succ_succ a1, xn_succ_succ b1]; exact
id              └──────────┘ └┘  └──────────┘ └┘
src         └──┘└──────────┘  └┘└──────────┘    └─────
typ         └──┘└──────────┘└┘└┘└──────────┘└┘  └─────
doc         └──┘              └┘                └─────
txt         └──┘              └┘                └─────
par         └──┘              └┘                └─────
pid           └┘              └┘                     
st         └──────────────────┘└───────────────┘└───────
512      modeq.modeq_mul (modeq.modeq_mul_left _ h) (xy_modeq_of_modeq (n+1)).left,
id       └─────────────┘  └──────────────────┘      └───────────────┘  
src  ───┘└─────────────┘ └──────────────────┘└─┘ └┘                    └──────┘
typ  ───┘└─────────────┘ └──────────────────┘└─┘└┘ └───────────────┘ └──────┘
doc  ───┘                                    └─┘ └┘                     └──────┘
txt  ───┘                                    └─┘ └┘                     └──────┘
par  ───┘                                    └─┘ └┘                     └──────┘
pid  ───┘                                    └─┘ └┘                     └─────┘
st   ────────────────────────────────────────────────────────────────────────────┘
513    modeq.modeq_add_cancel_right (xy_modeq_of_modeq n).right $
id     └──────────────────────────┘  └───────────────┘   └───┘
src    └──────────────────────────┘                      └───┘
typ    └──────────────────────────┘  └───────────────┘   └───┘
514      by rw [yn_succ_succ a1, yn_succ_succ b1]; exact
id              └──────────┘ └┘  └──────────┘ └┘
src         └──┘└──────────┘  └┘└──────────┘    └─────
typ         └──┘└──────────┘└┘└┘└──────────┘└┘  └─────
doc         └──┘              └┘                └─────
txt         └──┘              └┘                └─────
par         └──┘              └┘                └─────
pid           └┘              └┘                     
st         └──────────────────┘└───────────────┘└───────
515      modeq.modeq_mul (modeq.modeq_mul_left _ h) (xy_modeq_of_modeq (n+1)).right⟩
id       └─────────────┘  └──────────────────┘      └───────────────┘  
src  ───┘└─────────────┘ └──────────────────┘└─┘ └┘                     └───────┘
typ  ───┘└─────────────┘ └──────────────────┘└─┘└┘ └───────────────┘  └───────┘
doc  ───┘                                    └─┘ └┘                     └───────┘
txt  ───┘                                    └─┘ └┘                     └───────┘
par  ───┘                                    └─┘ └┘                     └───────┘
pid  ───┘                                    └─┘ └┘                     └──────┘
st   ─────────────────────────────────────────────────────────────────────────────┘
516  
517  theorem matiyasevic {a k x y} : (∃ a1 : a > 1, xn a1 k = x ∧ yn a1 k = y) ↔
id                                              └┘ └┘     └┘ └┘     
src                                              └┘          └┘          
typ                                             └┘ └┘     └┘ └┘     
doc                                                 └┘            └┘
518  a > 1 ∧ k ≤ y ∧
id           
src             
typ          
519  (x = 1 ∧ y = 0 ∨
id             
src              
typ            
520  ∃ (u v s t b : ℕ),
id                  
src                 
typ                 
521    x * x - (a * a - 1) * y * y = 1 ∧
id                        
src                             
typ                       
522    u * u - (a * a - 1) * v * v = 1 ∧
id                        
src                             
typ                       
523    s * s - (b * b - 1) * t * t = 1 ∧
id                        
src                             
typ                       
524    b > 1 ∧ b ≡ 1 [MOD 4 * y] ∧ b ≡ a [MOD u] ∧
id              └──┘         └──┘  
src               └──┘            └──┘   
typ             └──┘         └──┘  
doc                 └──┘              └──┘  
525    v > 0 ∧ y * y ∣ v ∧
id               
src                  
typ              
526    s ≡ x [MOD u] ∧
id        └──┘  
src         └──┘   
typ       └──┘  
doc         └──┘  
527    t ≡ k [MOD 4 * y]) :=
id        └──┘    
src         └──┘     
typ       └──┘    
doc         └──┘      
528  ⟨λ⟨a1, hx, hy⟩, by rw [← hx, ← hy];
id                           └┘    └┘
src                     └────┘  └──┘  
typ                    └────┘└┘└──┘└┘
doc                     └────┘  └──┘  
txt                     └────┘  └──┘  
par                     └────┘  └──┘  
pid                       └──┘  └──┘  
st                     └───────┘└────┘└─
529    refine ⟨a1, (nat.eq_zero_or_pos k).elim
id             └┘   └────────────────┘ 
src    └─────┘   └┘ └────────────────┘ └──────
typ    └─────┘ └┘└┘ └────────────────┘└──────
doc    └─────┘   └┘                    └──────
txt    └─────┘   └┘                    └──────
par    └─────┘   └┘                    └──────
pid             └┘                    └──────
st   ──────────────────────────────────────────
530      (λk0, by rw k0; exact ⟨le_refl _, or.inl ⟨rfl, rfl⟩⟩) (λkpos, _)⟩; exact
id                   └┘         └─────┘    └────┘       └─┘
src  ───┘  └──┘  └─┘  └┘└────┘ └─────┘└──┘└────┘    └┘└─┘└┘└┘  └───────┘  └─────
typ  ───┘  └──┘  └─┘└┘└──────┘ └─────┘└──┘└────┘    └┘└─┘└──┘  └───────┘  └─────
doc  ───┘  └──┘  └─┘  └┘└────┘        └──┘          └┘   └┘└┘  └───────┘  └─────
txt  ───┘  └──┘  └─┘  └┘└────┘        └──┘          └┘   └┘└┘  └───────┘  └─────
par  ───┘  └──┘  └─┘  └──────┘        └──┘          └┘   └──┘  └───────┘  └─────
pid  ───┘  └──┘  └──┘  └──────┘        └──┘          └┘   └──┘  └───────┘       
st   ───────────┘└──────────────────────────────────────────┘└────────────────────
531    let x := xn a1 k, y := yn a1 k,
src  ─┘   └────┘     └─────┘     └─
typ  ─┘   └────┘     └─────┘     └─
doc  ─┘   └────┘     └─────┘     └─
txt  ─┘   └────┘     └─────┘     └─
par  ─┘   └────┘     └─────┘     └─
pid  ─┘   └────┘     └─────┘     └─
st   ──────────────────────────────────
532        m := 2 * (k * y),
id                
src  ────────────┘    └──
typ  ────────────┘    └──
doc  ────────────┘     └──
txt  ────────────┘     └──
par  ────────────┘     └──
pid  ────────────┘     └──
st   ────────────────────────
533        u := xn a1 m, v := yn a1 m in
src  ──────────┘     └─────┘     └───
typ  ──────────┘     └─────┘     └───
doc  ──────────┘     └─────┘     └───
txt  ──────────┘     └─────┘     └───
par  ──────────┘     └─────┘     └───
pid  ──────────┘     └─────┘     └───
st   ────────────────────────────────────
534    have ky : k ≤ y, from yn_ge_n a1 k,
id                          └─────┘ └┘ 
src  ─┘    └────┘  └─────┘└─────┘   └─
typ  ─┘    └────┘  └─────┘└─────┘└┘└─
doc  ─┘    └────┘   └─────┘          └─
txt  ─┘    └────┘   └─────┘          └─
par  ─┘    └────┘   └─────┘          └─
pid  ─┘    └────┘   └─────┘          └─
st   ──────────────────────────────────────
535    have yv : y * y ∣ v, from dvd_trans (ysq_dvd_yy a1 k) $
id                              └───────┘  └────────┘
src  ─┘    └────┘    └─────┘└───────┘ └────────┘   └┘ 
typ  ─┘    └────┘    └─────┘└───────┘ └────────┘   └┘ 
doc  ─┘    └────┘     └─────┘                       └┘ 
txt  ─┘    └────┘     └─────┘                       └┘ 
par  ─┘    └────┘     └─────┘                       └┘ 
pid  ─┘    └────┘     └─────┘                       └┘ 
st   ──────────────────────────────────────────────────────────
536        (y_dvd_iff _ _ _).2 $ dvd_mul_left _ _,
id          └───────┘            └──────────┘
src  ─────┘ └───────┘└────────┘ └──────────┘└─────
typ  ─────┘ └───────┘└────────┘ └──────────┘└─────
doc  ─────┘          └────────┘             └─────
txt  ─────┘          └────────┘             └─────
par  ─────┘          └────────┘             └─────
pid  ─────┘          └────────┘             └─────
st   ──────────────────────────────────────────────
537    have uco : nat.coprime u (4 * y), from
src  ─┘    └─────┘             └┘  └───────
typ  ─┘    └─────┘             └┘  └───────
doc  ─┘    └─────┘             └┘  └───────
txt  ─┘    └─────┘             └┘  └───────
par  ─┘    └─────┘             └┘  └───────
pid  ─┘    └─────┘             └┘  └───────
st   ─────────────────────────────────────────
538      have 2 ∣ v, from modeq.modeq_zero_iff.1 $ (yn_modeq_two _ _).trans $
id                                                  └──────────┘
src  ───┘    └─┘  └─────┘                    └─┘  └──────────┘└──────────┘ 
typ  ───┘    └─┘  └─────┘                    └─┘  └──────────┘└──────────┘ 
doc  ───┘    └─┘  └─────┘                    └─┘              └──────────┘ 
txt  ───┘    └─┘  └─────┘                    └─┘              └──────────┘ 
par  ───┘    └─┘  └─────┘                    └─┘              └──────────┘ 
pid  ───┘    └─┘  └─────┘                    └─┘              └──────────┘ 
st   ─────────────────────────────────────────────────────────────────────────
539        modeq.modeq_zero_iff.2 (dvd_mul_right _ _),
id         └──────────────────┘    └───────────┘
src  ─────┘└──────────────────┘└─┘ └───────────┘└──────
typ  ─────┘└──────────────────┘└─┘ └───────────┘└──────
doc  ─────┘                    └─┘              └──────
txt  ─────┘                    └─┘              └──────
par  ─────┘                    └─┘              └──────
pid  ─────┘                    └─┘              └──────
st   ──────────────────────────────────────────────────
540      have nat.coprime u 2, from
src  ───┘    └───────────┘ └────────
typ  ───┘    └───────────┘ └────────
doc  ───┘    └───────────┘ └────────
txt  ───┘    └───────────┘ └────────
par  ───┘    └───────────┘ └────────
pid  ───┘    └───────────┘ └────────
st   ───────────────────────────────
541        (xy_coprime a1 m).coprime_dvd_right this,
id          └────────┘
src  ─────┘ └────────┘   └──────────────────┘    └─
typ  ─────┘ └────────┘   └──────────────────┘    └─
doc  ─────┘              └──────────────────┘    └─
txt  ─────┘              └──────────────────┘    └─
par  ─────┘              └──────────────────┘    └─
pid  ─────┘              └──────────────────┘    └─
st   ────────────────────────────────────────────────
542      (this.mul_right this).mul_right $
id            └────────┘
src  ───┘     └────────┘    └──────────┘ 
typ  ───┘     └────────┘    └──────────┘ 
doc  ───┘                   └──────────┘ 
txt  ───┘                   └──────────┘ 
par  ───┘                   └──────────┘ 
pid  ───┘                   └──────────┘ 
st   ──────────────────────────────────────
543        (xy_coprime _ _).coprime_dvd_right (dvd_of_mul_left_dvd yv),
id                                             └─────────────────┘
src  ─────┘           └──────────────────────┘ └─────────────────┘  └──
typ  ─────┘           └──────────────────────┘ └─────────────────┘  └──
doc  ─────┘           └──────────────────────┘                      └──
txt  ─────┘           └──────────────────────┘                      └──
par  ─────┘           └──────────────────────┘                      └──
pid  ─────┘           └──────────────────────┘                      └──
st   ───────────────────────────────────────────────────────────────────
544    let ⟨b, ba, bm1⟩ := modeq.chinese_remainder uco a 1 in
id            └┘  └─┘     └─────────────────────┘     
src  ─┘     └┘  └┘   └───┘└─────────────────────┘    └─────
typ  ─┘    └┘└┘└┘└─┘└───┘└─────────────────────┘   └─────
doc  ─┘     └┘  └┘   └───┘                           └─────
txt  ─┘     └┘  └┘   └───┘                           └─────
par  ─┘     └┘  └┘   └───┘                           └─────
pid  ─┘     └┘  └┘   └───┘                           └─────
st   ─────────────────────────────────────────────────────────
545    have m1 : 1 < m, from
id                 
src  ─┘    └──────┘ └──────
typ  ─┘    └──────┘ └──────
doc  ─┘    └──────┘  └──────
txt  ─┘    └──────┘  └──────
par  ─┘    └──────┘  └──────
pid  ─┘    └──────┘  └──────
st   ────────────────────────
546      have 0 < k * y, from mul_pos kpos (y_increasing a1 kpos),
id                            └─────┘       └──────────┘    └──┘
src  ───┘    └─┘    └─────┘└─────┘     └──────────┘      └──
typ  ───┘    └─┘    └─────┘└─────┘     └──────────┘  └──┘└──
doc  ───┘    └─┘    └─────┘                              └──
txt  ───┘    └─┘    └─────┘                              └──
par  ───┘    └─┘    └─────┘                              └──
pid  ───┘    └─┘    └─────┘                              └──
st   ──────────────────────────────────────────────────────────────
547      nat.mul_le_mul_left 2 this,
id       └─────────────────┘
src  ───┘└─────────────────┘└─┘    └─
typ  ───┘└─────────────────┘└─┘    └─
doc  ───┘                   └─┘    └─
txt  ───┘                   └─┘    └─
par  ───┘                   └─┘    └─
pid  ───┘                   └─┘    └─
st   ────────────────────────────────
548    have vp : v > 0, from y_increasing a1 (lt_trans zero_lt_one m1),
id                                           └──────┘ └─────────┘
src  ─┘    └────┘ └───────┘               └──────┘└─────────┘  └──
typ  ─┘    └────┘ └───────┘               └──────┘└─────────┘  └──
doc  ─┘    └────┘  └───────┘                                    └──
txt  ─┘    └────┘  └───────┘                                    └──
par  ─┘    └────┘  └───────┘                                    └──
pid  ─┘    └────┘  └───────┘                                    └──
st   ───────────────────────────────────────────────────────────────────
549    have b1 : b > 1, from
src  ─┘    └────┘  └────────
typ  ─┘    └────┘  └────────
doc  ─┘    └────┘  └────────
txt  ─┘    └────┘  └────────
par  ─┘    └────┘  └────────
pid  ─┘    └────┘  └────────
st   ────────────────────────
550      have u > xn a1 1, from x_increasing a1 m1,
id                └┘            └──────────┘
src  ───┘    └─┘ └┘  └───────┘└──────────┘    └─
typ  ───┘    └─┘ └┘  └───────┘└──────────┘    └─
doc  ───┘    └─┘ └┘  └───────┘                └─
txt  ───┘    └─┘     └───────┘                └─
par  ───┘    └─┘     └───────┘                └─
pid  ───┘    └─┘     └───────┘                └─
st   ───────────────────────────────────────────────
551      have u > a, by simp at this; exact this,
id                                          └──┘
src  ───┘    └─┘  └───┘└──────────┘└──────┘    └─
typ  ───┘    └─┘  └───┘└──────────┘└──────┘└──┘└─
doc  ───┘    └─┘  └───┘└──────────┘└──────┘    └─
txt  ───┘    └─┘  └───┘└──────────┘└──────┘    └─
par  ───┘    └─┘  └───┘└──────────┘└──────┘    └─
pid  ───┘    └─┘  └───────────────────────┘    └─
st   ─────────────────┘└───────────────────────┘└─
552      lt_of_lt_of_le a1 $ by delta modeq at ba;
id       └────────────┘
src  ───┘└────────────┘     └───────────────┘└─
typ  ───┘└────────────┘     └───────────────┘└─
doc  ───┘                   └───────────────┘└─
txt  ───┘                   └───────────────┘└─
par  ───┘                   └───────────────┘└─
pid  ───┘                   └───────────────────
st   ─────────────────────────┘└───────────────────
553        rw nat.mod_eq_of_lt this at ba; rw ← ba; apply nat.mod_le,
id            └──────────────┘ └──┘             └┘        └────────┘
src  ─────┘└─┘└──────────────┘    └────┘└┘└───┘  └┘└────┘└────────┘└─
typ  ─────┘└─┘└──────────────┘└──┘└────┘└┘└───┘└┘└──────┘└────────┘└─
doc  ─────┘└─┘                    └────┘└┘└───┘  └┘└────┘          └─
txt  ─────┘└─┘                    └────┘└┘└───┘  └┘└────┘          └─
par  ─────┘└─┘                    └────┘└┘└───┘  └──────┘          └─
pid  ────────┘                    └───────────┘  └──────┘          └─
st   ────────┘└──────────────┘└────────────────────────────────────┘└─
554    let s := xn b1 k, t := yn b1 k in
id                            └┘
src  ─┘   └────┘     └─────┘└┘   └───
typ  ─┘   └────┘     └─────┘└┘   └───
doc  ─┘   └────┘     └─────┘└┘   └───
txt  ─┘   └────┘     └─────┘     └───
par  ─┘   └────┘     └─────┘     └───
pid  ─┘   └────┘     └─────┘     └───
st   ────────────────────────────────────
555    have sx : s ≡ x [MOD u], from (xy_modeq_of_modeq b1 a1 ba k).left,
id                                  └───────────────┘
src  ─┘    └────┘         └─────┘ └───────────────┘       └───────
typ  ─┘    └────┘       └─────┘ └───────────────┘       └───────
doc  ─┘    └────┘         └─────┘                         └───────
txt  ─┘    └────┘         └─────┘                         └───────
par  ─┘    └────┘         └─────┘                         └───────
pid  ─┘    └────┘         └─────┘                         └───────
st   ─────────────────────────────────────────────────────────────────────
556    have tk : t ≡ k [MOD 4 * y], from
src  ─┘    └────┘       └─┘   └──────
typ  ─┘    └────┘       └─┘   └──────
doc  ─┘    └────┘       └─┘   └──────
txt  ─┘    └────┘       └─┘   └──────
par  ─┘    └────┘       └─┘   └──────
pid  ─┘    └────┘       └─┘   └──────
st   ────────────────────────────────────
557        have 4 * y ∣ b - 1, from int.coe_nat_dvd.1 $
id                                 └─────────────┘
src  ─────┘    └─┘    └───────┘└─────────────┘└─┘ 
typ  ─────┘    └─┘    └───────┘└─────────────┘└─┘ 
doc  ─────┘    └─┘     └───────┘               └─┘ 
txt  ─────┘    └─┘     └───────┘               └─┘ 
par  ─────┘    └─┘     └───────┘               └─┘ 
pid  ─────┘    └─┘     └───────┘               └─┘ 
st   ───────────────────────────────────────────────────
558          by rw int.coe_nat_sub (le_of_lt b1);
id                 └─────────────┘  └──────┘ └┘
src  ───────┘  └─┘└─────────────┘ └──────┘  └─
typ  ───────┘  └─┘└─────────────┘ └──────┘└┘└─
doc  ───────┘  └─┘                          └─
txt  ───────┘  └─┘                          └─
par  ───────┘  └─┘                          └─
pid  ───────┘  └──┘                          └──
st   ─────────┘└──────────────────────────────────
559             exact modeq.dvd_of_modeq bm1.symm,
id                    └────────────────┘ └──────┘
src  ────────────────┘└────────────────┘└──────┘└─
typ  ────────────────┘└────────────────┘└──────┘└─
doc  ────────────────┘                          └─
txt  ────────────────┘                          └─
par  ────────────────┘                          └─
pid  ────────────────┘                          └─
st   ───────────────────────────────────────────┘└─
560        modeq.modeq_of_dvd_of_modeq this $ yn_modeq_a_sub_one _ _,
id         └─────────────────────────┘        └────────────────┘
src  ─────┘└─────────────────────────┘     └────────────────┘└─────
typ  ─────┘└─────────────────────────┘     └────────────────┘└─────
doc  ─────┘                                                  └─────
txt  ─────┘                                                  └─────
par  ─────┘                                                  └─────
pid  ─────┘                                                  └─────
st   ─────────────────────────────────────────────────────────────────
561    ⟨ky, or.inr ⟨u, v, s, t, b,
id          └────┘    
src  ─┘   └┘└────┘  └┘ └┘ └┘ └┘ └─
typ  ─┘   └┘└────┘ └┘└┘ └┘ └┘ └─
doc  ─┘   └┘        └┘ └┘ └┘ └┘ └─
txt  ─┘   └┘        └┘ └┘ └┘ └┘ └─
par  ─┘   └┘        └┘ └┘ └┘ └┘ └─
pid  ─┘   └┘        └┘ └┘ └┘ └┘ └─
st   ──────────────────────────────
562      pell_eq _ _, pell_eq _ _, pell_eq _ _, b1, bm1, ba, vp, yv, sx, tk⟩⟩,
id                                 └─────┘                       └┘
src  ───┘       └────┘       └────┘└─────┘└────┘  └┘   └┘  └┘  └┘  └┘  └┘  └┘
typ  ───┘       └────┘       └────┘└─────┘└────┘  └┘   └┘  └┘  └┘└┘└┘  └┘  └┘
doc  ───┘       └────┘       └────┘       └────┘  └┘   └┘  └┘  └┘  └┘  └┘  └┘
txt  ───┘       └────┘       └────┘       └────┘  └┘   └┘  └┘  └┘  └┘  └┘  └┘
par  ───┘       └────┘       └────┘       └────┘  └┘   └┘  └┘  └┘  └┘  └┘  └┘
pid  ───┘       └────┘       └────┘       └────┘  └┘   └┘  └┘  └┘  └┘  └┘  └┘
st   ───────────────────────────────────────────────────────────────────────┘
563  λ⟨a1, ky, o⟩, ⟨a1, match o with
id    └┘  └┘  
typ   └┘  └┘  
564  | or.inl ⟨x1, y0⟩ := by rw y0 at ky; rw [nat.eq_zero_of_le_zero ky, x1, y0]; exact ⟨rfl, rfl⟩
id     └────┘                   └┘            └────────────────────┘ └┘  └┘  └┘               └─┘
src    └────┘                └─┘  └────┘  └──┘└────────────────────┘  └┘  └┘    └────┘    └┘└─┘└┘
typ    └────┘                └─┘└┘└────┘  └──┘└────────────────────┘└┘└┘└┘└┘└┘  └────┘    └┘└─┘└┘
doc                          └─┘  └────┘  └──┘                        └┘  └┘    └────┘    └┘   └┘
txt                          └─┘  └────┘  └──┘                        └┘  └┘    └────┘    └┘   └┘
par                          └─┘  └────┘  └──┘                        └┘  └┘    └────┘    └┘   └┘
pid                              └────┘    └┘                        └┘  └┘             └┘   
st                          └────────────────┘└───────────────────────┘└──┘└──┘└─────────────────┘
565  | or.inr ⟨u, v, s, t, b, xy, uv, st, b1, rem⟩ :=
id     └────┘            └┘  └┘  └┘  └┘  └─┘
src    └────┘
typ    └────┘            └┘  └┘  └┘  └┘  └─┘
566    match x, y, eq_pell a1 xy, u, v, eq_pell a1 uv, s, t, eq_pell b1 st, rem, ky with
id               └─────┘              └─────┘              └─────┘
src                └─────┘              └─────┘              └─────┘
typ              └─────┘              └─────┘              └─────┘
567    | ._, ._, ⟨i, rfl, rfl⟩, ._, ._, ⟨n, rfl, rfl⟩, ._, ._, ⟨j, rfl, rfl⟩,
id                                                                     └─┘
src                                                                     └─┘
typ                                                                    └─┘
568      ⟨(bm1 : b ≡ 1 [MOD 4 * yn a1 i]),
id                    └──┘    └┘     
src                   └──┘    └┘     
typ                   └──┘    └┘     
doc                   └──┘     └┘     
569       (ba : b ≡ a [MOD xn a1 n]),
id                  └──┘ └┘     
src                  └──┘ └┘     
typ                 └──┘ └┘     
doc                  └──┘ └┘     
570       (vp : yn a1 n > 0),
id              └┘      
src             └┘      
typ             └┘      
doc             └┘
571       (yv : yn a1 i * yn a1 i ∣ yn a1 n),
id              └┘       └┘       └┘
src             └┘       └┘       └┘
typ             └┘       └┘       └┘
doc             └┘        └┘        └┘
572       (sx : xn b1 j ≡ xn a1 i [MOD xn a1 n]),
id              └┘       └┘      └──┘ └┘     
src             └┘       └┘      └──┘ └┘     
typ             └┘       └┘      └──┘ └┘     
doc             └┘       └┘      └──┘ └┘     
573       (tk : yn b1 j ≡ k [MOD 4 * yn a1 i])⟩,
id              └┘        └──┘    └┘     
src             └┘         └──┘    └┘     
typ             └┘        └──┘    └┘     
doc             └┘         └──┘     └┘     
574       (ky : k ≤ yn a1 i) :=
id                └┘
src                └┘
typ               └┘
doc                 └┘
575      (nat.eq_zero_or_pos i).elim
id        └────────────────┘   └──┘
src       └────────────────┘   └──┘
typ       └────────────────┘   └──┘
576        (λi0, by simp [i0] at ky; rw [i0, ky]; exact ⟨rfl, rfl⟩) $ λipos,
id           └┘           └┘             └┘  └┘               └─┘      └──┘
src                 └────┘  └─────┘  └──┘  └┘    └────┘    └┘└─┘
typ          └┘     └────┘└┘└─────┘  └──┘└┘└┘└┘  └────┘    └┘└─┘     └──┘
doc                 └────┘  └─────┘  └──┘  └┘    └────┘    └┘   
txt                 └────┘  └─────┘  └──┘  └┘    └────┘    └┘   
par                 └────┘  └─────┘  └──┘  └┘    └────┘    └┘   
pid                       └───┘    └┘  └┘             └┘   
st                 └────────────────────┘└┘└──┘└────────────────┘
577      suffices i = k, by rw this; exact ⟨rfl, rfl⟩,
id                           └──┘              └─┘
src                        └─┘      └────┘    └┘└─┘
typ                       └─┘└──┘  └────┘    └┘└─┘
doc                         └─┘      └────┘    └┘   
txt                         └─┘      └────┘    └┘   
par                         └─┘      └────┘    └┘   
pid                                          └┘   
st                         └────────────────────────┘
578      by clear _x o rem xy uv st _match _match _fun_match; exact
src         └──────────────────────────────────────────────┘  └─────
typ         └──────────────────────────────────────────────┘  └─────
doc         └──────────────────────────────────────────────┘  └─────
txt         └──────────────────────────────────────────────┘  └─────
par         └──────────────────────────────────────────────┘  └─────
pid              └─────────────────────────────────────────┘       
st         └────────────────────────────────────────────────────────
579      have iln : i ≤ n, from le_of_not_gt $ λhin,
id                              └──────────┘
src  ───┘    └─────┘   └─────┘└──────────┘  └────
typ  ───┘    └─────┘   └─────┘└──────────┘  └────
doc  ───┘    └─────┘   └─────┘              └────
txt  ───┘    └─────┘   └─────┘              └────
par  ───┘    └─────┘   └─────┘              └────
pid  ───┘    └─────┘   └─────┘              └────
st   ────────────────────────────────────────────────
580      not_lt_of_ge (nat.le_of_dvd vp (dvd_of_mul_left_dvd yv)) (y_increasing a1 hin),
id       └──────────┘  └───────────┘ └┘  └─────────────────┘ └┘    └──────────┘ └┘
src  ───┘└──────────┘ └───────────┘   └─────────────────┘  └─┘ └──────────┘     └──
typ  ───┘└──────────┘ └───────────┘└┘ └─────────────────┘└┘└─┘ └──────────┘└┘   └──
doc  ───┘                                                  └─┘                  └──
txt  ───┘                                                  └─┘                  └──
par  ───┘                                                  └─┘                  └──
pid  ───┘                                                  └─┘                  └──
st   ────────────────────────────────────────────────────────────────────────────────────
581      have yd : 4 * yn a1 i ∣ 4 * n, from mul_dvd_mul_left _ $ dvd_of_ysq_dvd a1 yv,
id                                           └──────────────┘     └────────────┘
src  ───┘    └──────┘       └─┘  └─────┘└──────────────┘└─┘ └────────────┘    └─
typ  ───┘    └──────┘       └─┘  └─────┘└──────────────┘└─┘ └────────────┘    └─
doc  ───┘    └──────┘       └─┘  └─────┘                └─┘                   └─
txt  ───┘    └──────┘       └─┘  └─────┘                └─┘                   └─
par  ───┘    └──────┘       └─┘  └─────┘                └─┘                   └─
pid  ───┘    └──────┘       └─┘  └─────┘                └─┘                   └─
st   ───────────────────────────────────────────────────────────────────────────────────
582      have jk : j ≡ k [MOD 4 * yn a1 i], from
src  ───┘    └────┘       └─┘       └──────
typ  ───┘    └────┘       └─┘       └──────
doc  ───┘    └────┘       └─┘       └──────
txt  ───┘    └────┘       └─┘       └──────
par  ───┘    └────┘       └─┘       └──────
pid  ───┘    └────┘       └─┘       └──────
st   ────────────────────────────────────────────
583        have 4 * yn a1 i ∣ b - 1, from int.coe_nat_dvd.1 $
id                  └┘                  └─────────────┘
src  ─────┘    └─┘ └┘      └───────┘└─────────────┘└─┘ 
typ  ─────┘    └─┘ └┘    └───────┘└─────────────┘└─┘ 
doc  ─────┘    └─┘ └┘      └───────┘               └─┘ 
txt  ─────┘    └─┘         └───────┘               └─┘ 
par  ─────┘    └─┘         └───────┘               └─┘ 
pid  ─────┘    └─┘         └───────┘               └─┘ 
st   ─────────────────────────────────────────────────────────
584          by rw int.coe_nat_sub (le_of_lt b1); exact modeq.dvd_of_modeq bm1.symm,
id                 └─────────────┘  └──────┘ └┘         └────────────────┘ └──────┘
src  ───────┘  └─┘└─────────────┘ └──────┘  └──────┘└────────────────┘└──────┘└─
typ  ───────┘  └─┘└─────────────┘ └──────┘└┘└──────┘└────────────────┘└──────┘└─
doc  ───────┘  └─┘                          └──────┘                          └─
txt  ───────┘  └─┘                          └──────┘                          └─
par  ───────┘  └─┘                          └──────┘                          └─
pid  ───────┘  └──┘                          └───────┘                          └─
st   ─────────┘└──────────────────────────────────────────────────────────────────┘└─
585        (modeq.modeq_of_dvd_of_modeq this (yn_modeq_a_sub_one b1 _)).symm.trans tk,
id          └─────────────────────────┘       └────────────────┘                   └┘
src  ─────┘ └─────────────────────────┘     └────────────────┘  └──────────────┘  └─
typ  ─────┘ └─────────────────────────┘     └────────────────┘  └──────────────┘└┘└─
doc  ─────┘                                                     └──────────────┘  └─
txt  ─────┘                                                     └──────────────┘  └─
par  ─────┘                                                     └──────────────┘  └─
pid  ─────┘                                                     └──────────────┘  └─
st   ──────────────────────────────────────────────────────────────────────────────────
586      have ki : k + i < 4 * yn a1 i, from
id                  
src  ───┘    └────┘   └─┘      └──────
typ  ───┘    └────┘  └─┘      └──────
doc  ───┘    └────┘    └─┘      └──────
txt  ───┘    └────┘    └─┘      └──────
par  ───┘    └────┘    └─┘      └──────
pid  ───┘    └────┘    └─┘      └──────
st   ────────────────────────────────────────
587        lt_of_le_of_lt (add_le_add ky (yn_ge_n a1 i)) $
id         └────────────┘  └────────┘ └┘  └─────┘
src  ─────┘└────────────┘ └────────┘   └─────┘   └─┘ 
typ  ─────┘└────────────┘ └────────┘└┘ └─────┘   └─┘ 
doc  ─────┘                                      └─┘ 
txt  ─────┘                                      └─┘ 
par  ─────┘                                      └─┘ 
pid  ─────┘                                      └─┘ 
st   ──────────────────────────────────────────────────────
588        by rw ← two_mul; exact nat.mul_lt_mul_of_pos_right dec_trivial (y_increasing a1 ipos),
id                 └─────┘        └─────────────────────────┘ └─────────┘  └──────────┘ └┘ └──┘
src  ─────┘  └───┘└─────┘└──────┘└─────────────────────────┘└─────────┘ └──────────┘      └──
typ  ─────┘  └───┘└─────┘└──────┘└─────────────────────────┘└─────────┘ └──────────┘└┘└──┘└──
doc  ─────┘  └───┘       └──────┘                           └─────────┘                   └──
txt  ─────┘  └───┘       └──────┘                                                         └──
par  ─────┘  └───┘       └──────┘                                                         └──
pid  ─────┘  └────┘       └──────┘                                                         └──
st   ───────┘└─────────────────────────────────────────────────────────────────────────────────┘└─
589      have ji : j ≡ i [MOD 4 * n], from
src  ───┘    └────┘       └─┘   └──────
typ  ───┘    └────┘       └─┘   └──────
doc  ───┘    └────┘       └─┘   └──────
txt  ───┘    └────┘       └─┘   └──────
par  ───┘    └────┘       └─┘   └──────
pid  ───┘    └────┘       └─┘   └──────
st   ──────────────────────────────────────
590        have xn a1 j ≡ xn a1 i [MOD xn a1 n], from (xy_modeq_of_modeq b1 a1 ba j).left.symm.trans sx,
id                        └┘                           └───────────────┘       └┘                   └┘
src  ─────┘    └──┘    └┘             └─────┘ └───────────────┘       └────────────────┘  └─
typ  ─────┘    └──┘    └┘             └─────┘ └───────────────┘    └┘└────────────────┘└┘└─
doc  ─────┘    └──┘    └┘             └─────┘                         └────────────────┘  └─
txt  ─────┘    └──┘                   └─────┘                         └────────────────┘  └─
par  ─────┘    └──┘                   └─────┘                         └────────────────┘  └─
pid  ─────┘    └──┘                   └─────┘                         └────────────────┘  └─
st   ────────────────────────────────────────────────────────────────────────────────────────────────────
591        (modeq_of_xn_modeq a1 ipos iln this).resolve_right $ λ (ji : j + i ≡ 0 [MOD 4 * n]),
id          └───────────────┘                                                    └──┘     
src  ─────┘ └───────────────┘             └──────────────┘  └─────┘    └─┘    └─┘   └──
typ  ─────┘ └───────────────┘             └──────────────┘  └─────┘   └─┘└──┘└─┘ └──
doc  ─────┘                               └──────────────┘  └─────┘    └─┘    └─┘   └──
txt  ─────┘                               └──────────────┘  └─────┘    └─┘    └─┘   └──
par  ─────┘                               └──────────────┘  └─────┘    └─┘    └─┘   └──
pid  ─────┘                               └──────────────┘  └─────┘    └─┘    └─┘   └──
st   ───────────────────────────────────────────────────────────────────────────────────────────
592        not_le_of_gt ki $ nat.le_of_dvd (lt_of_lt_of_le ipos $ nat.le_add_left _ _) $
id         └──────────┘                     └────────────┘        └─────────────┘
src  ─────┘└──────────┘                 └────────────┘     └─────────────┘└────┘ 
typ  ─────┘└──────────┘                 └────────────┘     └─────────────┘└────┘ 
doc  ─────┘                                                               └────┘ 
txt  ─────┘                                                               └────┘ 
par  ─────┘                                                               └────┘ 
pid  ─────┘                                                               └────┘ 
st   ────────────────────────────────────────────────────────────────────────────────────
593        modeq.modeq_zero_iff.1 $ (modeq.modeq_add jk.symm (modeq.refl i)).trans $
id         └──────────────────┘      └─────────────┘   └───┘  └────────┘
src  ─────┘└──────────────────┘└─┘  └─────────────┘  └───┘ └────────┘ └───────┘ 
typ  ─────┘└──────────────────┘└─┘  └─────────────┘  └───┘ └────────┘ └───────┘ 
doc  ─────┘                    └─┘                                    └───────┘ 
txt  ─────┘                    └─┘                                    └───────┘ 
par  ─────┘                    └─┘                                    └───────┘ 
pid  ─────┘                    └─┘                                    └───────┘ 
st   ────────────────────────────────────────────────────────────────────────────────
594        modeq.modeq_of_dvd_of_modeq yd ji,
src  ─────┘                               └─
typ  ─────┘                               └─
doc  ─────┘                               └─
txt  ─────┘                               └─
par  ─────┘                               └─
pid  ─────┘                               └─
st   ─────────────────────────────────────────
595      by have : i % (4 * yn a1 i) = k % (4 * yn a1 i) :=
id                                           └┘ └┘ 
src  ───┘  └─────┘  └┘      └┘   └┘ └┘   └────
typ  ───┘  └─────┘  └┘      └┘  └┘ └┘└┘└────
doc  ───┘  └─────┘   └┘      └┘    └┘ └┘   └────
txt  ───┘  └─────┘   └┘      └┘    └┘      └────
par  ───┘  └─────┘   └┘      └┘    └┘      └────
pid  ───┘  └──────┘   └┘      └┘    └┘      └────
st   ─────┘└────────────────────────────────────────────────
596           (modeq.modeq_of_dvd_of_modeq yd ji).symm.trans jk;
id             └─────────────────────────┘ └┘ └┘             └┘
src  ────────┘ └─────────────────────────┘    └───────────┘  └─
typ  ────────┘ └─────────────────────────┘└┘└┘└───────────┘└┘└─
doc  ────────┘                                └───────────┘  └─
txt  ────────┘                                └───────────┘  └─
par  ────────┘                                └───────────┘  └─
pid  ────────┘                                └───────────┘  └─
st   ────────────────────────────────────────────────────────────
597         rwa [nat.mod_eq_of_lt (lt_of_le_of_lt (nat.le_add_left _ _) ki),
id               └──────────────┘  └────────────┘  └─────────────┘      └┘
src  ──────┘└───┘└──────────────┘ └────────────┘ └─────────────┘└────┘  └──
typ  ──────┘└───┘└──────────────┘ └────────────┘ └─────────────┘└────┘└┘└──
doc  ──────┘└───┘                                               └────┘  └──
txt  ──────┘└───┘                                               └────┘  └──
par  ──────┘└───┘                                               └────┘  └──
pid  ───────────┘                                               └────┘  └──
st   ───────────┘└────────────────────────────────────────────────────────┘└─
598              nat.mod_eq_of_lt (lt_of_le_of_lt (nat.le_add_right _ _) ki)] at this
id               └──────────────┘  └────────────┘  └──────────────┘      └┘
src  ───────────┘└──────────────┘ └────────────┘ └──────────────┘└────┘  └──────────
typ  ───────────┘└──────────────┘ └────────────┘ └──────────────┘└────┘└┘└──────────
doc  ───────────┘                                                └────┘  └──────────
txt  ───────────┘                                                └────┘  └──────────
par  ───────────┘                                                └────┘  └──────────
pid  ───────────┘                                                └────┘  └──────────
st   ──────────────────────────────────────────────────────────────────────┘└────────
599    end
src  ─┘
typ  ─┘
doc  ─┘
txt  ─┘
par  ─┘
pid  ─┘
st   ─┘
600  end⟩⟩
601  
602  lemma eq_pow_of_pell_lem {a y k} (a1 : 1 < a) (ypos : y > 0) : k > 0 → a > y^k →
id                                                                      
src                                                                          
typ                                                                     
603    (↑(y^k) : ℤ) < 2*a*y - y*y - 1 :=
id                  
src                       
typ                 
604  have y < a → 2*a*y ≥ a + (y*y + 1), begin
id                    
src                          
typ                   
st                                       └─────
605    intro ya, induction y with y IH, exact absurd ypos (lt_irrefl _),
id                                           └────┘ └──┘  └───────┘
src    └──────┘  └────────┘ └────────┘  └────┘└────┘     └───────┘└─┘
typ    └──────┘  └────────┘└────────┘  └────┘└────┘└──┘ └───────┘└─┘
doc    └──────┘  └────────┘ └────────┘  └────┘                    └─┘
txt    └──────┘  └────────┘ └────────┘  └────┘                    └─┘
par    └──────┘  └────────┘ └────────┘  └────┘                    └─┘
pid         └─┘            └───────┘                           └─┘
st   ─────────┘└─────────────────────┘└───────────────────────────────┘└─
606    cases nat.eq_zero_or_pos y with y0 ypos,
id           └────────────────┘ 
src    └────┘└────────────────┘ └───────────┘
typ    └────┘└────────────────┘└───────────┘
doc    └────┘                   └───────────┘
txt    └────┘                   └───────────┘
par    └────┘                   └───────────┘
pid                            └───────────┘
st   ────────────────────────────────────────┘└─
607    { rw y0, simpa [two_mul], },
id          └┘         └─────┘
src      └─┘    └─────┘└─────┘
typ      └─┘└┘  └─────┘└─────┘
doc      └─┘    └─────┘       
txt      └─┘    └─────┘       
par      └─┘    └─────┘       
pid                        
st   ───┘└───┘└───────────────┘└──┘
608    { rw [nat.mul_succ, nat.mul_succ, nat.succ_mul y],
id           └──────────┘  └──────────┘  └──────────┘ 
src      └──┘└──────────┘└┘└──────────┘└┘└──────────┘ 
typ      └──┘└──────────┘└┘└──────────┘└┘└──────────┘
doc      └──┘            └┘            └┘             
txt      └──┘            └┘            └┘             
par      └──┘            └┘            └┘             
pid        └┘            └┘            └┘             
st   ───────────────────┘└────────────┘└──────────────┘└─
609      have : 2 * a ≥ y + nat.succ y,
id                      └──────┘ 
src      └───────┘  └──────┘
typ      └───────┘ └──────┘
doc      └───────┘             
txt      └───────┘             
par      └───────┘             
pid      └───┘└──┘             
st   ────────────────────────────────┘└─
610      { change y + y < 2 * a, rw ← two_mul,
id                                 └─────┘
src        └─────┘   └─┘    └───┘└─────┘
typ        └─────┘  └─┘   └───┘└─────┘
doc        └─────┘    └─┘    └───┘
txt        └─────┘    └─┘    └───┘
par        └─────┘    └─┘    └───┘
pid                  └─┘      └─┘
st   ─────┘└──────────────────┘└────────────┘└─
611        exact mul_lt_mul_of_pos_left (nat.lt_of_succ_lt ya) dec_trivial },
id               └────────────────────┘  └───────────────┘ └┘  └─────────┘
src        └────┘└────────────────────┘ └───────────────┘  └┘└─────────┘
typ        └────┘└────────────────────┘ └───────────────┘└┘└┘└─────────┘
doc        └────┘                                          └┘└─────────┘
txt        └────┘                                          └┘           
par        └────┘                                          └┘           
pid                                                       └┘           
st   ─────────────────────────────────────────────────────────────────────┘└┘
612      have := add_le_add (IH ypos (nat.lt_of_succ_lt ya)) this,
id               └────────┘  └┘ └──┘  └───────────────┘ └┘   └──┘
src      └──────┘└────────┘        └───────────────┘  └─┘
typ      └──────┘└────────┘ └┘└──┘ └───────────────┘└┘└─┘└──┘
doc      └──────┘                                     └─┘
txt      └──────┘                                     └─┘
par      └──────┘                                     └─┘
pid      └───┘└─┘                                     └─┘
st   ───────────────────────────────────────────────────────────┘└─
613      simpa }
src      └────┘
typ      └────┘
doc      └────┘
txt      └────┘
par      └────┘
pid           
st   ─────────┘└─
614  end, λk0 yak,
id         └┘ └─┘
typ        └┘ └─┘
st   ──┘
615  lt_of_lt_of_le (int.coe_nat_lt_coe_nat_of_lt yak) $
id   └────────────┘  └──────────────────────────┘ └─┘
src  └────────────┘  └──────────────────────────┘
typ  └────────────┘  └──────────────────────────┘ └─┘
616  by rw sub_sub; apply le_sub_right_of_add_le;
id         └─────┘        └────────────────────┘
src     └─┘└─────┘  └────┘└────────────────────┘
typ     └─┘└─────┘  └────┘└────────────────────┘
doc     └─┘         └────┘
txt     └─┘         └────┘
par     └─┘         └────┘
pid                     
st     └──────────────────────────────────────────
617     apply int.coe_nat_le_coe_nat_of_le;
id            └──────────────────────────┘
src     └────┘└──────────────────────────┘
typ     └────┘└──────────────────────────┘
doc     └────┘
txt     └────┘
par     └────┘
pid          
st   ───────────────────────────────────────
618     have y1 := nat.pow_le_pow_of_le_right ypos k0; simp at y1;
id                 └────────────────────────┘ └──┘ └┘
src     └─────────┘└────────────────────────┘        └────────┘
typ     └─────────┘└────────────────────────┘└──┘└┘  └────────┘
doc     └─────────┘                                  └────────┘
txt     └─────────┘                                  └────────┘
par     └─────────┘                                  └────────┘
pid     └─────┘└─┘                                      └───┘
st   ──────────────────────────────────────────────────────────────
619     exact this (lt_of_le_of_lt y1 yak)
id            └──┘  └────────────┘ └┘ └─┘
src     └────┘     └────────────┘     └─
typ     └────┘└──┘ └────────────┘└┘└─┘└─
doc     └────┘                        └─
txt     └────┘                        └─
par     └────┘                        └─
pid                                  
st   ──────────────────────────────────────
620  
src  
typ  
doc  
txt  
par  
pid  
st   
621  theorem eq_pow_of_pell {m n k} : (n^k = m ↔
id                                        
src                                         
typ                                       
622  k = 0 ∧ m = 1 ∨ k > 0 ∧
id                 
src                   
typ                
623  (n = 0 ∧ m = 0 ∨ n > 0 ∧
id                  
src                    
typ                 
624  ∃ (w a t z : ℕ) (a1 : a > 1),
id                           
src                           
typ                          
625    xn a1 k ≡ yn a1 k * (a - n) + m [MOD t] ∧
id     └┘ └┘   └┘ └┘          └──┘  
src    └┘       └┘                 └──┘   
typ    └┘ └┘   └┘ └┘          └──┘  
doc    └┘       └┘                    └──┘  
626    2 * a * n = t + (n * n + 1) ∧
id                      
src                          
typ                     
627    m < t ∧ n ≤ w ∧ k ≤ w ∧
id                
src                     
typ               
628    a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1)) :=
id                                       
src                                              
typ                                      
629  ⟨λe, by rw ← e;
id               
src          └───┘
typ         └───┘
doc          └───┘
txt          └───┘
par          └───┘
pid            └─┘
st          └────────
630    refine (nat.eq_zero_or_pos k).elim
id             └────────────────┘ 
src    └─────┘ └────────────────┘ └──────
typ    └─────┘ └────────────────┘└──────
doc    └─────┘                    └──────
txt    └─────┘                    └──────
par    └─────┘                    └──────
pid                              └──────
st   ─────────────────────────────────────
631      (λk0, by rw k0; exact or.inl ⟨rfl, rfl⟩)
id                   └┘        └────┘       └─┘
src  ───┘  └──┘  └─┘  └┘└────┘└────┘    └┘└─┘└─
typ  ───┘  └──┘  └─┘└┘└──────┘└────┘    └┘└─┘└──
doc  ───┘  └──┘  └─┘  └┘└────┘          └┘   └─
txt  ───┘  └──┘  └─┘  └┘└────┘          └┘   └─
par  ───┘  └──┘  └─┘  └──────┘          └┘   └──
pid  ───┘  └──┘  └──┘  └──────┘          └┘   └──
st   ───────────┘└─────────────────────────────┘└─
632      (λkpos, or.inr ⟨kpos, _⟩);
id               └────┘
src  ───┘  └────┘└────┘     └───┘
typ  ───┘  └────┘└────┘     └───┘
doc  ───┘  └────┘           └───┘
txt  ───┘  └────┘           └───┘
par  ───┘  └────┘           └───┘
pid  ───┘  └────┘           └───┘
st   ───────────────────────────────
633    refine (nat.eq_zero_or_pos n).elim
id             └────────────────┘ 
src    └─────┘ └────────────────┘ └──────
typ    └─────┘ └────────────────┘└──────
doc    └─────┘                    └──────
txt    └─────┘                    └──────
par    └─────┘                    └──────
pid                              └──────
st   ─────────────────────────────────────
634      (λn0, by rw [n0, nat.zero_pow kpos]; exact or.inl ⟨rfl, rfl⟩)
id                    └┘  └──────────┘ └──┘         └────┘       └─┘
src  ───┘  └──┘  └──┘  └┘└──────────┘    └┘└────┘└────┘    └┘└─┘└─
typ  ───┘  └──┘  └──┘└┘└┘└──────────┘└──┘└──────┘└────┘    └┘└─┘└──
doc  ───┘  └──┘  └──┘  └┘                └┘└────┘          └┘   └─
txt  ───┘  └──┘  └──┘  └┘                └┘└────┘          └┘   └─
par  ───┘  └──┘  └──┘  └┘                └──────┘          └┘   └──
pid  ───┘  └──┘  └───┘  └┘                └───────┘          └┘   └──
st   ───────────┘└─────┘└─────────────────┘└───────────────────────┘└─
635      (λnpos, or.inr ⟨npos, _⟩); exact
id               └────┘
src  ───┘  └────┘└────┘     └───┘  └─────
typ  ───┘  └────┘└────┘     └───┘  └─────
doc  ───┘  └────┘           └───┘  └─────
txt  ───┘  └────┘           └───┘  └─────
par  ───┘  └────┘           └───┘  └─────
pid  ───┘  └────┘           └───┘       
st   ─────────────────────────────────────
636    let w := _root_.max n k in
id              └────────┘
src  ─┘   └────┘└────────┘  └───
typ  ─┘   └────┘└────────┘  └───
doc  ─┘   └────┘            └───
txt  ─┘   └────┘            └───
par  ─┘   └────┘            └───
pid  ─┘   └────┘            └───
st   ─────────────────────────────
637    have nw : n ≤ w, from le_max_left _ _,
id                          └─────────┘
src  ─┘    └────┘  └─────┘└─────────┘└─────
typ  ─┘    └────┘  └─────┘└─────────┘└─────
doc  ─┘    └────┘   └─────┘           └─────
txt  ─┘    └────┘   └─────┘           └─────
par  ─┘    └────┘   └─────┘           └─────
pid  ─┘    └────┘   └─────┘           └─────
st   ─────────────────────────────────────────
638    have kw : k ≤ w, from le_max_right _ _,
id                           └──────────┘
src  ─┘    └────┘   └─────┘└──────────┘└─────
typ  ─┘    └────┘   └─────┘└──────────┘└─────
doc  ─┘    └────┘   └─────┘            └─────
txt  ─┘    └────┘   └─────┘            └─────
par  ─┘    └────┘   └─────┘            └─────
pid  ─┘    └────┘   └─────┘            └─────
st   ──────────────────────────────────────────
639    have wpos : w > 0, from lt_of_lt_of_le npos nw,
id                            └────────────┘ └──┘
src  ─┘    └──────┘ └───────┘└────────────┘      └─
typ  ─┘    └──────┘ └───────┘└────────────┘└──┘  └─
doc  ─┘    └──────┘  └───────┘                    └─
txt  ─┘    └──────┘  └───────┘                    └─
par  ─┘    └──────┘  └───────┘                    └─
pid  ─┘    └──────┘  └───────┘                    └─
st   ──────────────────────────────────────────────────
640    have w1 : w + 1 > 1, from nat.succ_lt_succ wpos,
id                              └──────────────┘
src  ─┘    └────┘ └─┘ └───────┘└──────────────┘    └─
typ  ─┘    └────┘ └─┘ └───────┘└──────────────┘    └─
doc  ─┘    └────┘  └─┘ └───────┘                    └─
txt  ─┘    └────┘  └─┘ └───────┘                    └─
par  ─┘    └────┘  └─┘ └───────┘                    └─
pid  ─┘    └────┘  └─┘ └───────┘                    └─
st   ───────────────────────────────────────────────────
641    let a := xn w1 w in
src  ─┘   └────┘     └───
typ  ─┘   └────┘     └───
doc  ─┘   └────┘     └───
txt  ─┘   └────┘     └───
par  ─┘   └────┘     └───
pid  ─┘   └────┘     └───
st   ──────────────────────
642    have a1 : a > 1, from x_increasing w1 wpos,
id                           └──────────┘
src  ─┘    └────┘  └───────┘└──────────┘      └─
typ  ─┘    └────┘  └───────┘└──────────┘      └─
doc  ─┘    └────┘  └───────┘                  └─
txt  ─┘    └────┘  └───────┘                  └─
par  ─┘    └────┘  └───────┘                  └─
pid  ─┘    └────┘  └───────┘                  └─
st   ──────────────────────────────────────────────
643    let x := xn a1 k, y := yn a1 k in
id              └┘
src  ─┘   └────┘└┘   └─────┘     └───
typ  ─┘   └────┘└┘   └─────┘     └───
doc  ─┘   └────┘└┘   └─────┘     └───
txt  ─┘   └────┘     └─────┘     └───
par  ─┘   └────┘     └─────┘     └───
pid  ─┘   └────┘     └─────┘     └───
st   ────────────────────────────────────
644    let ⟨z, ze⟩ := show w ∣ yn w1 w, from modeq.modeq_zero_iff.1 $
id                           └┘
src  ─┘     └┘  └───┘     └┘   └─────┘                    └─┘ 
typ  ─┘    └┘  └───┘     └┘   └─────┘                    └─┘ 
doc  ─┘     └┘  └───┘      └┘   └─────┘                    └─┘ 
txt  ─┘     └┘  └───┘           └─────┘                    └─┘ 
par  ─┘     └┘  └───┘           └─────┘                    └─┘ 
pid  ─┘     └┘  └───┘           └─────┘                    └─┘ 
st   ─────────────────────────────────────────────────────────────────
645      modeq.trans (yn_modeq_a_sub_one w1 w) (modeq.modeq_zero_iff.2 $ dvd_refl _) in
id       └─────────┘  └────────────────┘        └──────────────────┘     └──────┘
src  ───┘└─────────┘ └────────────────┘   └┘ └──────────────────┘└─┘ └──────┘└──────
typ  ───┘└─────────┘ └────────────────┘   └┘ └──────────────────┘└─┘ └──────┘└──────
doc  ───┘                                 └┘                     └─┘         └──────
txt  ───┘                                 └┘                     └─┘         └──────
par  ───┘                                 └┘                     └─┘         └──────
pid  ───┘                                 └┘                     └─┘         └──────
st   ───────────────────────────────────────────────────────────────────────────────────
646    have nt : (↑(n^k) : ℤ) < 2 * a * n - n * n - 1, from
id                                           
src  ─┘    └────┘    └──┘└┘└─┘       └────────
typ  ─┘    └────┘    └──┘└┘└─┘       └────────
doc  ─┘    └────┘      └──┘ └┘ └─┘         └────────
txt  ─┘    └────┘      └──┘ └┘ └─┘         └────────
par  ─┘    └────┘      └──┘ └┘ └─┘         └────────
pid  ─┘    └────┘      └──┘ └┘ └─┘         └────────
st   ───────────────────────────────────────────────────────
647      eq_pow_of_pell_lem a1 npos kpos $ calc
id       └────────────────┘         └──┘
src  ───┘└────────────────┘               
typ  ───┘└────────────────┘      └──┘     
doc  ───┘                                 
txt  ───┘                                 
par  ───┘                                 
pid  ───┘                                 
st   ───────────────────────────────────────────
648        n^k ≤ n^w       : nat.pow_le_pow_of_le_right npos kw
id                         └────────────────────────┘
src  ─────┘       └───────┘└────────────────────────┘      
typ  ─────┘     └───────┘└────────────────────────┘      
doc  ─────┘       └───────┘                                
txt  ─────┘       └───────┘                                
par  ─────┘       └───────┘                                
pid  ─────┘       └───────┘                                
st   ───────────────────────────────────────────────────────────
649        ... < (w + 1)^w : nat.pow_lt_pow_of_lt_left (nat.lt_succ_of_le nw) wpos
id                           └───────────────────────┘  └───────────────┘
src  ─────────┘    └─┘  └─┘└───────────────────────┘ └───────────────┘  └┘    
typ  ─────────┘    └─┘  └─┘└───────────────────────┘ └───────────────┘  └┘    
doc  ─────────┘    └─┘  └─┘                                             └┘    
txt  ─────────┘    └─┘  └─┘                                             └┘    
par  ─────────┘    └─┘  └─┘                                             └┘    
pid  ─────────┘    └─┘  └─┘                                             └┘    
st   ──────────────────────────────────────────────────────────────────────────────
650        ... ≤ a         : xn_ge_a_pow w1 w,
id                           └─────────┘
src  ─────────┘  └─────────┘└─────────┘   └─
typ  ─────────┘  └─────────┘└─────────┘   └─
doc  ─────────┘  └─────────┘              └─
txt  ─────────┘  └─────────┘              └─
par  ─────────┘  └─────────┘              └─
pid  ─────────┘  └─────────┘              └─
st   ──────────────────────────────────────────
651    let ⟨t, te⟩ := int.eq_coe_of_zero_le $
id                   └───────────────────┘
src  ─┘     └┘  └───┘└───────────────────┘ 
typ  ─┘    └┘  └───┘└───────────────────┘ 
doc  ─┘     └┘  └───┘                      
txt  ─┘     └┘  └───┘                      
par  ─┘     └┘  └───┘                      
pid  ─┘     └┘  └───┘                      
st   ─────────────────────────────────────────
652      le_trans (int.coe_zero_le _) $ le_of_lt nt in
id       └──────┘  └─────────────┘      └──────┘
src  ───┘└──────┘ └─────────────┘└──┘ └──────┘  └───
typ  ───┘└──────┘ └─────────────┘└──┘ └──────┘  └───
doc  ───┘                        └──┘           └───
txt  ───┘                        └──┘           └───
par  ───┘                        └──┘           └───
pid  ───┘                        └──┘           └───
st   ──────────────────────────────────────────────────
653    have na : n ≤ a, from le_trans nw $ le_of_lt $ n_lt_xn w1 w,
id                                                   └─────┘
src  ─┘    └────┘   └─────┘                    └─────┘   └─
typ  ─┘    └────┘  └─────┘                    └─────┘   └─
doc  ─┘    └────┘   └─────┘                              └─
txt  ─┘    └────┘   └─────┘                              └─
par  ─┘    └────┘   └─────┘                              └─
pid  ─┘    └────┘   └─────┘                              └─
st   ───────────────────────────────────────────────────────────────
654    have tm : x ≡ y * (a - n) + n^k [MOD t], begin
id                        
src  ─┘    └────┘        └┘          └───────
typ  ─┘    └────┘       └┘          └───────
doc  ─┘    └────┘        └┘          └───────
txt  ─┘    └────┘        └┘          └───────
par  ─┘    └────┘        └┘          └───────
pid  ─┘    └────┘        └┘          └───────
st   ───────────────────────────────────────────────┘
655      apply modeq.modeq_of_dvd,
id             └────────────────┘
src  ───┘└────┘└────────────────┘└─
typ  ─────────┘└────────────────┘└─
doc  ───┘└────┘                  └─
txt  ───┘└────┘                  └─
par  ─────────┘                  └─
pid  ─────────┘                  └─
st   ───────────────────────────┘└─
656      rw [int.coe_nat_add, int.coe_nat_mul, int.coe_nat_sub na, ← te],
id           └─────────────┘  └─────────────┘  └─────────────┘ └┘    └┘
src  ───┘└──┘└─────────────┘└┘└─────────────┘└┘└─────────────┘  └──┘  └─
typ  ───┘└──┘└─────────────┘└┘└─────────────┘└┘└─────────────┘└┘└──┘└┘└─
doc  ───┘└──┘               └┘               └┘                 └──┘  └─
txt  ───┘└──┘               └┘               └┘                 └──┘  └─
par  ───┘└──┘               └┘               └┘                 └──┘  └─
pid  ───────┘               └┘               └┘                 └──┘  └──
st   ──────────────────────┘└───────────────┘└──────────────────┘└────┘└──
657      exact x_sub_y_dvd_pow a1 n k
id             └─────────────┘ └┘  
src  ─────────┘└─────────────┘    
typ  ─────────┘└─────────────┘└┘
doc  ─────────┘                   
txt  ─────────┘                   
par  ─────────┘                   
pid  ─────────┘                   
st   ─────────────────────────────────
658    end,
src  ───────
typ  ───────
doc  ───────
txt  ───────
par  ───────
pid  ───────
st   ─┘└─┘└─
659    have ta : 2 * a * n = t + (n * n + 1), from int.coe_nat_inj $
id                                               └─────────────┘
src  ─┘    └──────┘           └────────┘└─────────────┘ 
typ  ─┘    └──────┘          └────────┘└─────────────┘ 
doc  ─┘    └──────┘            └────────┘                
txt  ─┘    └──────┘            └────────┘                
par  ─┘    └──────┘            └────────┘                
pid  ─┘    └──────┘            └────────┘                
st   ────────────────────────────────────────────────────────────────
660      by rw [int.coe_nat_add, ← te, sub_sub];
id              └─────────────┘    └┘  └─────┘
src  ───┘  └──┘└─────────────┘└──┘  └┘└─────┘└─
typ  ───┘  └──┘└─────────────┘└──┘└┘└┘└─────┘└─
doc  ───┘  └──┘               └──┘  └┘       └─
txt  ───┘  └──┘               └──┘  └┘       └─
par  ───┘  └──┘               └──┘  └┘       └─
pid  ───┘  └───┘               └──┘  └┘       └──
st   ─────┘└──────────────────┘└────┘└───────┘└─
661         repeat {rw int.coe_nat_add <|> rw int.coe_nat_mul};
id                     └─────────────┘        └─────────────┘
src  ──────┘└──────┘└─┘└─────────────┘└──┘└─┘└─────────────┘└─
typ  ──────┘└──────┘└─┘└─────────────┘└──┘└─┘└─────────────┘└─
doc  ──────┘└──────┘└─┘               └──┘└─┘               └─
txt  ──────┘└──────┘└─┘               └──┘└─┘               └─
par  ──────┘└──────┘└─┘               └──┘└─┘               └─
pid  ─────────────────┘               └──────┘               └──
st   ──────────────┘└────────────────────────┘└──────────────┘└─
662         rw [int.coe_nat_one, sub_add_cancel]; refl,
id              └─────────────┘  └────────────┘
src  ──────┘└──┘└─────────────┘└┘└────────────┘└┘└──┘└─
typ  ──────┘└──┘└─────────────┘└┘└────────────┘└┘└──┘└─
doc  ──────┘└──┘               └┘              └┘└──┘└─
txt  ──────┘└──┘               └┘              └┘└──┘└─
par  ──────┘└──┘               └┘              └┘└──┘└─
pid  ──────────┘               └┘              └────────
st   ──────────┘└─────────────┘└──────────────┘└────┘└─
663    have mt : n^k < t, from int.lt_of_coe_nat_lt_coe_nat $
id                             └──────────────────────────┘
src  ─┘    └────┘     └─────┘└──────────────────────────┘ 
typ  ─┘    └────┘     └─────┘└──────────────────────────┘ 
doc  ─┘    └────┘     └─────┘                             
txt  ─┘    └────┘     └─────┘                             
par  ─┘    └────┘     └─────┘                             
pid  ─┘    └────┘     └─────┘                             
st   ─────────────────────────────────────────────────────────
664      by rw ← te; exact nt,
id               └┘        └┘
src  ───┘  └───┘  └──────┘  └─
typ  ───┘  └───┘└┘└──────┘└┘└─
doc  ───┘  └───┘  └──────┘  └─
txt  ───┘  └───┘  └──────┘  └─
par  ───┘  └───┘  └──────┘  └─
pid  ───┘  └────┘  └──────┘  └─
st   ─────┘└────────────────┘└─
665    have zp : a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1,
id                        
src  ─┘    └────┘        └──┘    └──┘ └──┘     └┘     └┘ └───
typ  ─┘    └────┘      └──┘    └──┘ └──┘     └┘     └┘ └───
doc  ─┘    └────┘        └──┘    └──┘ └──┘     └┘     └┘ └───
txt  ─┘    └────┘        └──┘    └──┘ └──┘     └┘     └┘ └───
par  ─┘    └────┘        └──┘    └──┘ └──┘     └┘     └┘ └───
pid  ─┘    └────┘        └──┘    └──┘ └──┘     └┘     └┘ └───
st   ─────────────────────────────────────────────────────────────────────
666      by rw ← ze; exact pell_eq w1 w,
id               └┘        └─────┘ └┘ 
src  ──────┘└───┘  └──────┘└─────┘   └─
typ  ──────┘└───┘└┘└──────┘└─────┘└┘└─
doc  ──────┘└───┘  └──────┘          └─
txt  ──────┘└───┘  └──────┘          └─
par  ──────┘└───┘  └──────┘          └─
pid  ───────────┘  └──────┘          └─
st   ─────┘└──────────────────────────┘└─
667    ⟨w, a, t, z, a1, tm, ta, mt, nw, kw, zp⟩,
id                                    └┘
src  ─┘  └┘ └┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘  └┘  
typ  ─┘ └┘└┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘└┘└┘  
doc  ─┘  └┘ └┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘  └┘  
txt  ─┘  └┘ └┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘  └┘  
par  ─┘  └┘ └┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘  └┘  
pid  ─┘  └┘ └┘ └┘ └┘  └┘  └┘  └┘  └┘  └┘  └┘  
st   ─────────────────────────────────────────┘
668  λo, match o with
id            
typ           
669  | or.inl ⟨k0, m1⟩ := by rw [k0, m1]; refl
id     └────┘                    └┘  └┘
src    └────┘                └──┘  └┘    └───┘
typ    └────┘                └──┘└┘└┘└┘  └───┘
doc                          └──┘  └┘    └───┘
txt                          └──┘  └┘    └───┘
par                          └──┘  └┘    └───┘
pid                            └┘  └┘        
st                          └─────┘└──┘└─────┘
670  | or.inr ⟨kpos, or.inl ⟨n0, m0⟩⟩ := by rw [n0, m0, nat.zero_pow kpos]
id     └────┘        └────┘                     └┘  └┘  └──────────┘ └──┘
src    └────┘        └────┘                 └──┘  └┘  └┘└──────────┘    └┘
typ    └────┘        └────┘                 └──┘└┘└┘└┘└┘└──────────┘└──┘└┘
doc                                         └──┘  └┘  └┘                └┘
txt                                         └──┘  └┘  └┘                └┘
par                                         └──┘  └┘  └┘                └┘
pid                                           └┘  └┘  └┘                
st                                         └─────┘└──┘└─────────────────┘
671  | or.inr ⟨kpos, or.inr ⟨npos, w, a, t, z,
id                   └────┘  └──┘  
src                  └────┘
typ                  └────┘  └──┘  
672     (a1 : a > 1),
id              
src             
typ             
673     (tm : xn a1 k ≡ yn a1 k * (a - n) + m [MOD t]),
id            └┘      └┘              └──┘  
src           └┘       └┘                 └──┘  
typ           └┘      └┘              └──┘  
doc           └┘       └┘                    └──┘  
674     (ta : 2 * a * n = t + (n * n + 1)),
id                           
src                             
typ                          
675     (mt : m < t),
id             
src             
typ            
676     (nw : n ≤ w),
id            
src             
typ           
677     (kw : k ≤ w),
id             
src             
typ            
678     (zp : a * a - ((w + 1) * (w + 1) - 1) * (w * z) * (w * z) = 1)⟩⟩ :=
id                                                     
src                                                     
typ                                                    
679    have wpos : w > 0, from lt_of_lt_of_le npos nw,
id                            └────────────┘
src                           └────────────┘
typ                           └────────────┘
680    have w1 : w + 1 > 1, from nat.succ_lt_succ wpos,
id                             └──────────────┘ └──┘
src                            └──────────────┘
typ                            └──────────────┘ └──┘
681    let ⟨j, xj, yj⟩ := eq_pell w1 zp in
id     └─┘                └─────┘ └┘
src                       └─────┘
typ    └─┘                └─────┘ └┘
682    by clear _match o _let_match; exact
src       └───────────────────────┘  └─────
typ       └───────────────────────┘  └─────
doc       └───────────────────────┘  └─────
txt       └───────────────────────┘  └─────
par       └───────────────────────┘  └─────
pid            └──────────────────┘       
st       └─────────────────────────────────
683    have jpos : j > 0, from (nat.eq_zero_or_pos j).resolve_left $ λj0,
id                              └────────────────┘ 
src  ─┘    └──────┘  └───────┘ └────────────────┘ └─────────────┘  └───
typ  ─┘    └──────┘  └───────┘ └────────────────┘└─────────────┘  └───
doc  ─┘    └──────┘  └───────┘                    └─────────────┘  └───
txt  ─┘    └──────┘  └───────┘                    └─────────────┘  └───
par  ─┘    └──────┘  └───────┘                    └─────────────┘  └───
pid  ─┘    └──────┘  └───────┘                    └─────────────┘  └───
st   ─────────────────────────────────────────────────────────────────────
684      have a1 : a = 1, by rw j0 at xj; exact xj,
id                             └┘              └┘
src  ───┘    └────┘  └─────┘└─┘  └────┘└──────┘  └─
typ  ───┘    └────┘ └─────┘└─┘└┘└────┘└──────┘└┘└─
doc  ───┘    └────┘  └─────┘└─┘  └────┘└──────┘  └─
txt  ───┘    └────┘  └─────┘└─┘  └────┘└──────┘  └─
par  ───┘    └────┘  └─────┘└─┘  └────┘└──────┘  └─
pid  ───┘    └────┘  └────────┘  └────────────┘  └─
st   ──────────────────────┘└────────────────────┘└─
685      have 2 * n = t + (n * n + 1), by rw a1 at ta; exact ta,
id                                          └┘              └┘
src  ───┘    └─┘          └──────┘└─┘  └────┘└──────┘  └─
typ  ───┘    └─┘         └──────┘└─┘└┘└────┘└──────┘└┘└─
doc  ───┘    └─┘          └──────┘└─┘  └────┘└──────┘  └─
txt  ───┘    └─┘          └──────┘└─┘  └────┘└──────┘  └─
par  ───┘    └─┘          └──────┘└─┘  └────┘└──────┘  └─
pid  ───┘    └─┘          └─────────┘  └────────────┘  └─
st   ───────────────────────────────────┘└────────────────────┘└─
686      have n1 : n = 1, from
src  ───┘    └────┘  └────────
typ  ───┘    └────┘  └────────
doc  ───┘    └────┘  └────────
txt  ───┘    └────┘  └────────
par  ───┘    └────┘  └────────
pid  ───┘    └────┘  └────────
st   ──────────────────────────
687        have n * n < n * 2, by rw [mul_comm n 2, this]; apply nat.le_add_left,
id                                    └──────┘     └──┘         └─────────────┘
src  ─────┘    └─┘     └─────┘└──┘└──────┘ └──┘    └┘└────┘└─────────────┘└─
typ  ─────┘    └─┘     └─────┘└──┘└──────┘└──┘└──┘└──────┘└─────────────┘└─
doc  ─────┘    └─┘     └─────┘└──┘         └──┘    └┘└────┘               └─
txt  ─────┘    └─┘     └─────┘└──┘         └──┘    └┘└────┘               └─
par  ─────┘    └─┘     └─────┘└──┘         └──┘    └──────┘               └─
pid  ─────┘    └─┘     └─────────┘         └──┘    └───────┘               └─
st   ───────────────────────────┘└──────────────┘└─────┘└─────────────────────┘└─
688        have n ≤ 1, from nat.le_of_lt_succ $ lt_of_mul_lt_mul_left this (nat.zero_le _),
id                          └───────────────┘   └───────────────────┘       └─────────┘
src  ─────┘    └─┘ └───────┘└───────────────┘ └───────────────────┘     └─────────┘└────
typ  ─────┘    └─┘ └───────┘└───────────────┘ └───────────────────┘     └─────────┘└────
doc  ─────┘    └─┘ └───────┘                                                       └────
txt  ─────┘    └─┘ └───────┘                                                       └────
par  ─────┘    └─┘ └───────┘                                                       └────
pid  ─────┘    └─┘ └───────┘                                                       └────
st   ───────────────────────────────────────────────────────────────────────────────────────
689        le_antisymm this npos,
id         └─────────┘      └──┘
src  ─────┘└─────────┘        └─
typ  ─────┘└─────────┘    └──┘└─
doc  ─────┘                   └─
txt  ─────┘                   └─
par  ─────┘                   └─
pid  ─────┘                   └─
st   ─────────────────────────────
690      by rw n1 at this;
id             └┘
src  ───┘  └─┘  └──────┘└─
typ  ───┘  └─┘└┘└──────┘└─
doc  ───┘  └─┘  └──────┘└─
txt  ───┘  └─┘  └──────┘└─
par  ───┘  └─┘  └──────┘└─
pid  ───┘  └──┘  └─────────
st   ─────┘└───────────────
691        rw ← @nat.add_right_cancel 0 2 t this at mt;
id               └──────────────────┘      └──┘
src  ─────┘└───┘ └──────────────────┘└───┘     └────┘└─
typ  ─────┘└───┘ └──────────────────┘└───┘└──┘└────┘└─
doc  ─────┘└───┘                     └───┘     └────┘└─
txt  ─────┘└───┘                     └───┘     └────┘└─
par  ─────┘└───┘                     └───┘     └────┘└─
pid  ──────────┘                     └───┘     └───────
st   ───────────────────────────────────────────────────
692        exact nat.not_lt_zero _ mt,
id               └─────────────┘   └┘
src  ───────────┘└─────────────┘└─┘└┘└─
typ  ───────────┘└─────────────┘└─┘└┘└─
doc  ───────────┘               └─┘  └─
txt  ───────────┘               └─┘  └─
par  ───────────┘               └─┘  └─
pid  ───────────┘               └─┘  └─
st   ───────────────────────────────┘└─
693    have wj : w ≤ j, from nat.le_of_dvd jpos $ modeq.modeq_zero_iff.1 $
id                           └───────────┘
src  ─┘    └────┘   └─────┘└───────────┘                         └─┘ 
typ  ─┘    └────┘   └─────┘└───────────┘                         └─┘ 
doc  ─┘    └────┘   └─────┘                                      └─┘ 
txt  ─┘    └────┘   └─────┘                                      └─┘ 
par  ─┘    └────┘   └─────┘                                      └─┘ 
pid  ─┘    └────┘   └─────┘                                      └─┘ 
st   ──────────────────────────────────────────────────────────────────────
694      (yn_modeq_a_sub_one w1 j).symm.trans $
id        └────────────────┘ └┘
src  ───┘ └────────────────┘   └───────────┘ 
typ  ───┘ └────────────────┘└┘ └───────────┘ 
doc  ───┘                      └───────────┘ 
txt  ───┘                      └───────────┘ 
par  ───┘                      └───────────┘ 
pid  ───┘                      └───────────┘ 
st   ───────────────────────────────────────────
695      modeq.modeq_zero_iff.2 ⟨z, yj.symm⟩,
id       └──────────────────┘      └─────┘
src  ───┘└──────────────────┘└─┘  └┘└─────┘└──
typ  ───┘└──────────────────┘└─┘ └┘└─────┘└──
doc  ───┘                    └─┘  └┘       └──
txt  ───┘                    └─┘  └┘       └──
par  ───┘                    └─┘  └┘       └──
pid  ───┘                    └─┘  └┘       └──
st   ─────────────────────────────────────────
696    have nt : (↑(n^k) : ℤ) < 2 * a * n - n * n - 1, from
src  ─┘    └────┘      └──┘ └┘ └─┘         └────────
typ  ─┘    └────┘      └──┘ └┘ └─┘         └────────
doc  ─┘    └────┘      └──┘ └┘ └─┘         └────────
txt  ─┘    └────┘      └──┘ └┘ └─┘         └────────
par  ─┘    └────┘      └──┘ └┘ └─┘         └────────
pid  ─┘    └────┘      └──┘ └┘ └─┘         └────────
st   ───────────────────────────────────────────────────────
697      eq_pow_of_pell_lem a1 npos kpos $ calc
id       └────────────────┘ └┘      └──┘
src  ───┘└────────────────┘               
typ  ───┘└────────────────┘└┘    └──┘     
doc  ───┘                                 
txt  ───┘                                 
par  ───┘                                 
pid  ───┘                                 
st   ───────────────────────────────────────────
698        n^k ≤ n^j       : nat.pow_le_pow_of_le_right npos (le_trans kw wj)
id                          └────────────────────────┘       └──────┘ └┘
src  ─────┘       └───────┘└────────────────────────┘     └──────┘    └─
typ  ─────┘      └───────┘└────────────────────────┘     └──────┘└┘  └─
doc  ─────┘       └───────┘                                           └─
txt  ─────┘       └───────┘                                           └─
par  ─────┘       └───────┘                                           └─
pid  ─────┘       └───────┘                                           └─
st   ─────────────────────────────────────────────────────────────────────────
699        ... < (w + 1)^j : nat.pow_lt_pow_of_lt_left (nat.lt_succ_of_le nw) jpos
id                          └───────────────────────┘  └───────────────┘ └┘
src  ─────────┘    └─┘  └─┘└───────────────────────┘ └───────────────┘  └┘    
typ  ─────────┘   └─┘  └─┘└───────────────────────┘ └───────────────┘└┘└┘    
doc  ─────────┘    └─┘  └─┘                                             └┘    
txt  ─────────┘    └─┘  └─┘                                             └┘    
par  ─────────┘    └─┘  └─┘                                             └┘    
pid  ─────────┘    └─┘  └─┘                                             └┘    
st   ──────────────────────────────────────────────────────────────────────────────
700        ... ≤ xn w1 j   : xn_ge_a_pow w1 j
id               └┘          └─────────┘
src  ─────────┘ └┘   └───┘└─────────┘   
typ  ─────────┘ └┘   └───┘└─────────┘   
doc  ─────────┘ └┘   └───┘              
txt  ─────────┘      └───┘              
par  ─────────┘      └───┘              
pid  ─────────┘      └───┘              
st   ─────────────────────────────────────────
701        ... = a         : xj.symm,
id                           └─────┘
src  ─────────┘  └─────────┘└─────┘└─
typ  ─────────┘  └─────────┘└─────┘└─
doc  ─────────┘  └─────────┘       └─
txt  ─────────┘  └─────────┘       └─
par  ─────────┘  └─────────┘       └─
pid  ─────────┘  └─────────┘       └─
st   ─────────────────────────────────
702    have na : n ≤ a, by rw xj; exact
id                            └┘
src  ─┘    └────┘   └───┘└─┘  └───────
typ  ─┘    └────┘   └───┘└─┘└┘└───────
doc  ─┘    └────┘   └───┘└─┘  └───────
txt  ─┘    └────┘   └───┘└─┘  └───────
par  ─┘    └────┘   └───┘└─┘  └───────
pid  ─┘    └────┘   └──────┘  └───────
st   ────────────────────┘└─────────────
703      le_trans (le_trans nw wj) (le_of_lt $ n_lt_xn _ _),
id                 └──────┘ └┘ └┘   └──────┘   └─────┘
src  ───┘         └──────┘    └┘ └──────┘ └─────┘└──────
typ  ───┘         └──────┘└┘└┘└┘ └──────┘ └─────┘└──────
doc  ───┘                     └┘                 └──────
txt  ───┘                     └┘                 └──────
par  ───┘                     └┘                 └──────
pid  ───┘                     └┘                 └──────
st   ─────────────────────────────────────────────────────┘└─
704    have te : (t : ℤ) = 2 * ↑a * ↑n - ↑n * ↑n - 1, by
src  ─┘    └────┘  └─┘ └┘ └─┘             └──────
typ  ─┘    └────┘  └─┘ └┘ └─┘             └──────
doc  ─┘    └────┘  └─┘ └┘ └─┘             └──────
txt  ─┘    └────┘  └─┘ └┘ └─┘             └──────
par  ─┘    └────┘  └─┘ └┘ └─┘             └──────
pid  ─┘    └────┘  └─┘ └┘ └─┘             └──────
st   ──────────────────────────────────────────────────┘
705      rw sub_sub; apply eq_sub_of_add_eq; apply (int.coe_nat_eq_coe_nat_iff _ _).2;
id          └─────┘        └──────────────┘         └────────────────────────┘
src  ───┘└─┘└─────┘└┘└────┘└──────────────┘└┘└────┘ └────────────────────────┘└─────┘└─
typ  ───┘└─┘└─────┘└──────┘└──────────────┘└──────┘ └────────────────────────┘└────────
doc  ───┘└─┘       └┘└────┘                └┘└────┘                           └─────┘└─
txt  ───┘└─┘       └┘└────┘                └┘└────┘                           └─────┘└─
par  ───┘└─┘       └──────┘                └──────┘                           └────────
pid  ──────┘       └──────┘                └──────┘                           └────────
st   ──────────────────────────────────────────────────────────────────────────────────
706      exact ta.symm,
id             └─────┘
src  ─────────┘└─────┘└─
typ  ─────────┘└─────┘└─
doc  ─────────┘       └─
txt  ─────────┘       └─
par  ─────────┘       └─
pid  ─────────┘       └─
st   ────────────────┘└─
707    have xn a1 k ≡ yn a1 k * (a - n) + n^k [MOD t],
id                    └┘
src  ─┘    └──┘    └┘        └┘          └─
typ  ─┘    └──┘    └┘        └┘          └─
doc  ─┘    └──┘    └┘        └┘          └─
txt  ─┘    └──┘              └┘          └─
par  ─┘    └──┘              └┘          └─
pid  ─┘    └──┘              └┘          └─
st   ──────────────────────────────────────────────────
708      by have := x_sub_y_dvd_pow a1 n k;
id                  └─────────────┘ └┘  
src  ──────┘└──────┘└─────────────┘    └─
typ  ──────┘└──────┘└─────────────┘└┘└─
doc  ──────┘└──────┘                   └─
txt  ──────┘└──────┘                   └─
par  ──────┘└──────┘                   └─
pid  ──────────────┘                   └─
st   ─────┘└────────────────────────────────
709         rw [← te, ← int.coe_nat_sub na] at this; exact modeq.modeq_of_dvd this,
id                └┘    └─────────────┘ └┘                 └────────────────┘ └──┘
src  ──────┘└────┘  └──┘└─────────────┘  └───────┘└──────┘└────────────────┘    └─
typ  ──────┘└────┘└┘└──┘└─────────────┘└┘└───────┘└──────┘└────────────────┘└──┘└─
doc  ──────┘└────┘  └──┘                 └───────┘└──────┘                      └─
txt  ──────┘└────┘  └──┘                 └───────┘└──────┘                      └─
par  ──────┘└────┘  └──┘                 └───────┘└──────┘                      └─
pid  ────────────┘  └──┘                 └───────────────┘                      └─
st   ──────────┘└──┘└────────────────────┘└─────────────────────────────────────┘└─
710    have n^k % t = m % t, from
id                   
src  ─┘    └┘       └──────
typ  ─┘    └┘      └──────
doc  ─┘    └┘        └──────
txt  ─┘    └┘        └──────
par  ─┘    └┘        └──────
pid  ─┘    └┘        └──────
st   ─────────────────────────────
711      modeq.modeq_add_cancel_left (modeq.refl _) (this.symm.trans tm),
id       └─────────────────────────┘  └────────┘         └───┘└────┘ └┘
src  ───┘└─────────────────────────┘ └────────┘└──┘     └───┘└────┘  └──
typ  ───┘└─────────────────────────┘ └────────┘└──┘     └───┘└────┘└┘└──
doc  ───┘                                      └──┘                  └──
txt  ───┘                                      └──┘                  └──
par  ───┘                                      └──┘                  └──
pid  ───┘                                      └──┘                  └──
st   ─────────────────────────────────────────────────────────────────────
712    by rw ← te at nt;
id             └┘
src  ─┘  └───┘  └────┘└─
typ  ─┘  └───┘└┘└────┘└─
doc  ─┘  └───┘  └────┘└─
txt  ─┘  └───┘  └────┘└─
par  ─┘  └───┘  └────┘└─
pid  ─┘  └────┘  └───────
st   ───┘└───────────────
713       rwa [nat.mod_eq_of_lt (int.lt_of_coe_nat_lt_coe_nat nt), nat.mod_eq_of_lt mt] at this
id             └──────────────┘  └──────────────────────────┘ └┘   └──────────────┘ └┘
src  ────┘└───┘└──────────────┘ └──────────────────────────┘  └─┘└──────────────┘└┘└────────┘
typ  ────┘└───┘└──────────────┘ └──────────────────────────┘└┘└─┘└──────────────┘└┘└────────┘
doc  ────┘└───┘                                               └─┘                  └────────┘
txt  ────┘└───┘                                               └─┘                  └────────┘
par  ────┘└───┘                                               └─┘                  └────────┘
pid  ─────────┘                                               └─┘                  └────────┘
st   ─────────┘└────────────────────────────────────────────────┘└───────────────────┘└───────┘
714  end⟩
715  
716  end pell